2012-04-09 12 views
8

Ho letto in più punti che una struttura C può essere definita in modo sicuro più volte, eppure ottengo un errore di "ridefinizione di struct" da gcc per la definizione di una struct (attraverso più include). Un esempio molto semplificato si presenta così:È possibile definire una struttura C più volte?

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; 
}; 

Se corro gcc foo.c ottengo:

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 

So che non ho inserito alcuna protezione di inclusione e che risolverà l'errore di compilazione, ma la mia comprensione è che questo dovrebbe funzionare comunque. Ho anche provato due definizioni struct bar in foo.c e ottengo lo stesso messaggio di errore? Quindi, le strutture possono essere definite più volte in C o no?

risposta

12

Una struttura in C può essere dichiarata più volte in modo sicuro, ma può essere definita solo una volta.

struct bar; 
    struct bar{}; 
    struct bar; 

compila bene, perché la barra viene definita solo una volta e dichiarata tutte le volte che vuoi.

+2

esempio molto corretto e bel esempio per l'OP :) – Lefteris

+0

sì, in pratica ogni cosa in C può essere dichiarata più volte, ma definirne una una volta. –

+0

Beh, immagino che chiarisca le cose. Grazie. – Elektito

0

La struttura può essere definita solo una volta per ogni file che si compila. Qui, includi a.h due volte. (Una volta direttamente e una volta via b.h.)

È necessario modificare il codice in modo che il simbolo venga definito una sola volta per un determinato file di origine.

0

No, non possono essere definiti più volte ed è per questo che #ifndef include le guardie e dovrebbero usarle.

Avere

#include "a.h" 

all'interno b.h file di intestazione significa ridefinite bar. Se avessi #ifndef includendo guardie questo non accadrebbe.

0

Non hai macro #ifdef nel file di intestazione. Se includi le intestazioni in più file sorgente, troverai questo errore.

0

Lo stesso simbolo nello stesso ambito non può essere definito due volte. Quello a cui probabilmente ti riferisci è che è sicuro includere la struct da due file C diversi, il che significa essenzialmente che sono definiti due volte (poiché non c'è esportazione) e la condivisione di queste strutture non sarà un problema, dal momento che sono compilate allo stesso layout di memoria

Problemi correlati