[C con Clase] Error en programacion multi-fichero.

Steven Davidson srd4121 en njit.edu
Vie Ene 29 19:37:03 CET 2010


Hola Jorge,

Jorge Vega Sanchez wrote:
>     Buenas.
> He preguntado en ocsaiones anteriores sobre la división de código en
> varios ficheros. Bueno pues tras leerme los consejos que dabais me
> he puesto a hacer una prueba sencilla para ver si tenia cogidos los 
> conceptos. Llevo 2 horas intentando buscar donde está el error en
> este sencillo programa pero no enceuntro nada.
> 
> Al compilar se pega como 2 segundos en un bucle dadndo errores y al 
> final salen errores incongruentes por pantalla que los compruebo en
> el código y están bien.
> 
> Adjunto los ficheros  a ver si alguno me puede ayudar.
> Para compilar uso g++ y la siguiente isntruccion
> 
> g++ prueba.cpp funciones.h funciones.cpp -o test
> 

El problema está en "funciones.h", ya que #incluyes el fichero 
"prueba.cpp" y éste #incluye "funciones.h". Por lo tanto, existe una 
recursividad indirecta. Un fichero incluye al otro y éste incluye al 
anterior que intenta incluir el segundo el cual a su vez intenta incluir 
el primero y así sucesivamente. Esto no es lo que quieres. Además, date 
cuenta que "funciones.h" no necesitas saber absolutamente nada acerca de 
"prueba.cpp".

El otro error es que usas 'num' en "funciones.cpp" sin previa 
declaración. Podrías hacer esto:

// funciones.cpp

int num;

Ahora bien, sospecho que quieres usar la definición de 'num' que hiciste 
en "prueba.cpp". Lo anterior definirá otra variable 'num' que será 
diferente a la que definiste en "prueba.cpp". Como cada fichero fuente 
es compilado independientemente de los demás, debes indicar al enlazador 
que se trata de la misma variable. Esto lo hacemos con 'extern'. Esto es,

// funciones.cpp

extern int num;

Con esto, realizamos una declaración y no una definición; es decir, no 
creamos una variable ni por tanto creamos memoria para ella.

Claro está, no deberías usar variables globales, pero como se trata de 
un programa de prueba, puedes seguir con ello.


Espero haber aclarado las dudas.

Steven





Más información sobre la lista de distribución Cconclase