10.1 Tipos de ficheros
Los ficheros de cabecera del proyecto se llamarán fichero.h (si trabajamos en C) o fichero.hh (si
trabajamos en C++) (también sería correcto el uso de fichero.hpp para C++)
Los ficheros con el codigo de las funciones no inline se llamará fichero.c (si trabajamos en C) o fichero.cc
(si trabajamos en C++) (también sería correcto el uso de fichero.cpp para C++)
Los ficheros con el codigo de las funciones inline se llamará fichero.ic (si trabajamos en C) o fichero.icc
(si trabajamos en C++) (también sería correcto el uso de fichero.ipp)
El separar las funciones inline (funciones definidas en una sóla línea) de las demás funciones se debe a que
algunos debuggers (y más raramente algunos compiladores) no manejan bien las funciones inline.
Separando las funciones inline en un fichero aparte, podemos conseguir que se incluyan en los ficheros de
cabecera o en los ficheros fuente, según nosotros deseemos de acuerdo a directivas de compilación.
A continuación se muestra en un ejemplo como se haría...
// At the end of fichero.hh
#if !defined(DEBUG_MODE)
#include <fichero.icc>
#endif
|
// At the end of fichero.cc
#if defined(DEBUG_MODE)
#include <fichero.icc>
#endif
|
Con este ejemplo conseguimos que si se compila en modo debug (definiendo DEBUG_MODE) las funciones
inline (funcion.icc) se incluiran en el fichero.hh, mientras que en el modo normal se
incuirian en el fichero.cc
[subir]
10.2 Nombres de los ficheros
Para C en cada fichero de una librería tiene que haber funciones realcionadas con el mismo fin, y el nombre
sería el apropiado para poder identificar el fin de estas funciones (por ejemplo funcionesFecha.c para
recopilar funciones de manejo de fechas).
Para C++ en cada fichero de una librería tiene que haber solamente una clase, y el nombre del fichero sería
el mismo que el de la clase (por ejemplo CMiClase.cc para la implementación de la clase CMiClase).
[subir]
10.3 Estructura de los ficheros
Los ficheros de cabecera (fichero.h, fichero.hh, fichero.hpp) tendrían que tener una
estructura como la siguiente:
- Cabecera del fichero.
- Includes si es necesario alguno (se aconseja que en los ficheros de cabecera no vaya ningún
fichero include o el mínimo número imprescindible de ellos).
- Primero los includes del sistema (si hace falta alguno)
- Después los includes propios del proyecto (si hace falta alguno)
- Constantes simbólicas y definiciones de macros que se vayan a utilizar en otros m&ocaute;dulos que
incluyan este.
- Definición de tipos que se vayan a utilizar en otros módulos que incluyan este.
- Prototipos de las funciones del módulo que puedan ser utilizadas desde otro módulo.
- Declaración de las clases (C++) del módulo que puedan ser utilizadas desde otro módulo.
Los ficheros fuente (fichero.c, fichero.cc, fichero.cpp) tendrían que tener una
estructura como la siguiente:
- Cabecera del fichero.
- Includes necesarios para el módulo.
- Primero los includes del sistema.
- Después los includes propios del proyecto.
- Constantes simbólicas y dfiniciones de macros que solamente vayan a utilizarse en este módulo.
- Definición de tipos que se vayan a utilizar solamente en este módulo.
- Variables globales usadas en el módulo.
- Primero las declaradas en otros módulos distintos, con la palabra reservada extern.
- Después las declaradas en este m&odulo.
- Prototipos de las funciones del módulo que sólo se usen en este módulo.
- Declaración de las clases (C++) del módulo que sólo se usen en este módulo.
- Implementación de las funciones del módulo.
La función principal (main()) tiene que ser la primera, las demás
estarán ordenadas por orden de aparición en la función principal o por
orden de llamada, u organizándolas por su uso o finalidad.
Es aconsejable que las implementaciones estén en el mismo orden que sus prototipos.
- Implementación de los métodos de las clases (C++).
Es aconsejable que las implementaciones de los métodos estén en el mismo orden
en que aparecen en las declaraciones de las clases.
Los ficheros que contienen las funciones inline (fichero.ic, fichero.icc,
fichero.ipp) solamente contendrán el código de las funciones inline y
tendrán una estructura como la siguiente:
- Cabecera del fichero
- Código de las funciones inline.
Se aconseja que estén en el mismo orden en que se declaran en el fichero de cabecera.
[subir]
10.4 Cabeceras de los ficheros
[subir]
10.5 Ficheros de cabecera (*.h)
Todos los ficheros de cabecera tienen que tener un mecanismo para impedir que sean incluidos más
de una vez (lo mismo les pasaría a los ficheros de las funciones inline).
Por ejemplo, el siguiente metodo valdría:
#ifndef __FICHERO_H__
#define __FICHERO_H__
// __FICHERO_H__ sería un identificador propio de este fichero (fichero.h)
// ya que lo he construido con el nombre del fichero
...
// Aquí iría todo el contenido del fichero
...
#endif
|
Todos los ficheros de cabecera incluidos en los ficheros deben serlo exclusivamente por que se usan.
Hay que evitar la inclusión de ficheros de cabecera que no se usan, por legibilidad, puede complicar la
compilación y el linkado innecesariamente.
Los includes de librerías própias del sistema se realiza indicando el nombre entre
caracteres < y >. Por ejemplo:
Los includes propios del proyecto se realizarán indicando el nombre entre caracteres ".
Por ejemplo:
[subir]
|