PDA

Ver la versión completa : Problema con #include en C



Puck2099
14/01/2005, 17:03
Hola,

Después de dividir varias funciones de mi juego en una librería aparte para tenerlo más organizado me está dando el GCC unos problemas que no sé como solucionar.

A ver cómo lo explico... el programa tiene el módulo principal gpmain.c que tira de varias librerías, las que me dan problemas son las creadas por mi.

gpmain.c hace uso de "tablero.h" y "fases.h" mediante #include
"tablero.h" a su vez hace uso de "tipos.h" donde tengo definidos los tipos creados para mi programa (estructuras y demás).
"fases.h" también hace uso mediante #include de "tipos.h"

Así mismo, gpmain.c también utiliza los tipos definidos en "tipos.h", pero como ya están incluídos en las otras dos pues no lo incluyo en esta.

Los errores que me dan son del tipo:


tipos.h:3: conflicting types for 'ninja'
tipos.h:3: previous declaration of 'ninja'


Supongo que estos errores me dan porque al incluirse el "tipos.h" en los dos módulos y tirar el "gpmain.c" de estos pues se encuentra con dos declaraciones (iguales) de los tipos. Pero de ser así, ¿qué tendría que hacer?, ¿tirar todo de un mismo fichero?

Puede parecer que sea un novato con estas preguntas, no es así, pero es que estoy loco con esto...

Muchas gracias

Lizardos
14/01/2005, 17:31
pues en tipos.h pones en la cabecera
#ifndef __TIPOS_H__
#define __TIPOS_H__

/* Pones aquí tu código*/

#endif /*Ultima linea de tipos.h*/

Y así el archivo de cabecera solo es procesado una vez por objeto.

theNestruo
14/01/2005, 17:33
Al hacer un #include, lo que ocurre internamente es que el .h "se copia" en donde está el include. Si tu "tipos.h" está siendo utilizado por varios archivos, se copiará varias veces, y por eso te dice que ya se ha declarado lo que hay en él. Para evitar eso, los .h suelen tener la siguiente estructura:


#ifndef _TIPOS_H
#define _TIPOS_H

/*
* Todas las cosas del .h vienen aquí:
* definiciones de tipos, prototipos de las funciones, etc...
*/

#endif /* _TIPOS_H */

Por otra parte, las variables NO se deben de declarar en los .h por un problema similar al anterior. Si quieres tener una variable en un .h tienes que hacer lo siguiente:


/* Esto es en el .h */
extern int a;

/* ...y esto es en algún .c */
int a;

De modo que la variable se declara en el .c, pero en el .h se dice que existe por algún lado (el enlazador ya se encargará de buscarla)
Finalmente (aunque esto no viene mucho al caso), si declaras variables que sólo se utilizan dentro de un .c (por ejemplo, float posicion[3]; dentro de un supuesto camera.c), te recomiendo que las declares como static (static float posicion[3];) para pertenezca al ámbito (al "scope") de ese .c. De este modo, si otro módulo (otro .c) declara una variable llamada posicion no tendrás problemas.

¡Suerte!

oankali
14/01/2005, 17:33
Empieza y acaba tus .h de esta manera:



#ifndef __archivo_h__
#define __archivo_h__

.
.
.

#endif /*__archivo_h__*/

<archivo> siendo el nombre de tu .h
De esta manera lo puedes incluir tantas veces como quieras.

Puck2099
14/01/2005, 19:44
Muchas gracias a todos por la ayuda, ahora ya lo tengo claro :brindis:

Saludos