2012-04-09 12 views
8

He leído en varios lugares que una estructura C se puede definir con seguridad varias veces y, sin embargo, obtengo un error de "redefinición de la estructura" de gcc para multiplicar la definición de una estructura (a través de varias inclusiones). Un ejemplo muy simplificado es el siguiente:¿Se puede definir una estructura C varias veces?

foo.c:

#include "a.h" 
#include "b.h" 

int main(int argc, char *argv[]) { 
    struct bar b; 
    b.a = 2; 
    return 0; 
} 

ah:

struct bar { 
    int a; 
    int b; 
}; 

BH:

#include "a.h" 

struct buz { 
    int x; 
    int y; 
}; 

Si me quedo gcc foo.c me sale:

In file included from b.h:1:0, 
       from foo.c:2: 
a.h:1:8: error: redefinition of ‘struct bar’ 
a.h:1:8: note: originally defined here 

Sé que no puse guardias de inclusión y corregirán el error de compilación, pero entendí que, no obstante, esto debería funcionar. También probé dos definiciones struct bar en foo.c y me sale el mismo mensaje de error? Entonces, ¿pueden las estructuras definirse varias veces en C o no?

Respuesta

12

Una estructura en C puede ser declarada varias veces de manera segura, pero solo se puede definir una vez.

struct bar; 
    struct bar{}; 
    struct bar; 

compila bien, porque la barra solo se define una vez y se declara tantas veces como desee.

+2

ejemplo muy correcto, y buen ejemplo para el OP :) – Lefteris

+0

Sí, básicamente todo en C se puede declarar varias veces, pero definir una vez. –

+0

Bueno, supongo que eso aclara las cosas. Gracias. – Elektito

0

La estructura solo se puede definir una vez para cada archivo que compila. Aquí, estás incluyendo a.h dos veces. (Una vez directamente y una vez vía b.h.)

Debe cambiar el código para que el símbolo solo se defina una vez para un archivo fuente determinado.

0

No, no se pueden definir varias veces y es por eso que #ifndef incluye guardias y debería usarlos.

Tener

#include "a.h" 

dentro b.h archivo de cabecera significa redefinir bar. Si tuviera #ifndef incluir guardias esto no estaría sucediendo.

0

No tiene #ifdef macros en su archivo de encabezado. Si incluye sus encabezados en múltiples archivos fuente, se encontrará con ese error.

0

El mismo símbolo en el mismo ámbito no se puede definir dos veces. Probablemente se esté refiriendo a que es seguro incluir la estructura de dos archivos C diferentes, lo que significa que están definidos dos veces (ya que no hay exportación) y compartir estas estructuras no será un problema, ya que están compiladas con el mismo diseño de memoria

Cuestiones relacionadas