2012-04-09 9 views
8

Ich habe an mehreren Stellen gelesen, dass eine C-Struktur sicher mehrere Male definiert werden kann, und dennoch bekomme ich eine "Neudefinition der Struktur" -Fehler von gcc für die mehrfache Definition einer Struktur (durch mehrere Includes). Ein sehr vereinfachtes Beispiel sieht wie folgt aus:Kann eine C-Struktur mehrfach definiert werden?

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

Wenn ich gcc foo.c laufen erhalte ich:

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 

Ich weiß, dass ich keine Include-Wächter gestellt habe und diese werden den Kompilierungsfehler beheben, aber mein Verständnis war, dass dies trotzdem funktionieren sollte. Ich habe auch versucht, zwei struct bar Definitionen in foo.c und ich bekomme die gleiche Fehlermeldung? Also, können Strukturen mehrfach in C definiert werden oder nicht?

Antwort

12

Eine Struktur in C kann mehrfach mehrfach sicher deklariert werden, kann aber nur einmal definiert werden.

struct bar; 
    struct bar{}; 
    struct bar; 

Kompiliert gut, weil der Balken nur einmal definiert und so oft deklariert wird, wie Sie möchten.

+2

sehr korrektes Beispiel, und nettes Beispiel für das OP :) – Lefteris

+0

yeah, im Grunde kann jedes Ding in C mehrfach erklärt werden aber definiert man einmal. –

+0

Nun, ich denke, das macht alles klar. Vielen Dank. – Elektito

0

Die Struktur kann nur einmal für jede kompilierte Datei definiert werden. Hier geben Sie zweimal a.h an. (Einmal direkt und einmal über b.h.)

Sie müssen Ihren Code ändern, so dass das Symbol nur einmal für eine bestimmte Quelldatei definiert wird.

0

Nein, sie können nicht mehrfach definiert werden und deshalb haben Sie #ifndef include guards und sollten diese verwenden.

Mit

#include "a.h" 

innerhalb b.h Header-Datei bedeutet, dass Sie bar neu definieren. Wenn du #ifndef Wächter eingeschlossen hättest, würde das nicht passieren.

0

Sie haben keine #ifdef-Makros in Ihrer Header-Datei. Wenn Sie Ihre Header in mehrere Quelldateien einschließen, tritt dieser Fehler auf.

0

Das gleiche Symbol im selben Bereich kann nicht zweimal definiert werden. Was Sie wahrscheinlich darauf beziehen, ist, dass es sicher ist, die Struktur aus zwei verschiedenen C-Dateien einzuschließen, was im Wesentlichen bedeutet, dass sie doppelt definiert sind (da kein Export existiert) und das Teilen dieser Strukturen kein Problem ist, da sie kompiliert werden zum selben Speicherlayout

Verwandte Themen