Kann eine C-Struktur mehrfach definiert werden?

8

Ich habe an mehreren Stellen gelesen, dass eine C-Struktur sicher mehrere Male definiert werden kann, und dennoch bekomme ich einen "redefinition of struct" -Fehler von gcc für die mehrfache Definition einer Struktur (durch mehrere Includes). Ein sehr vereinfachtes Beispiel sieht so aus:

foo.c:

%Vor%

a.h:

%Vor%

b.h:

%Vor%

Wenn ich gcc foo.c starte, bekomme ich:

%Vor%

Ich weiß, dass ich keine Wächter eingeschlossen habe, und diese werden den Kompilierfehler beheben, aber mein Verständnis war, dass dies trotzdem funktionieren sollte. Ich probierte auch zwei struct bar Definitionen in foo.c und ich bekomme die gleiche Fehlermeldung? Kann man also Strukturen mehrfach in C definieren oder nicht?

    
Elektito 09.04.2012, 14:54
quelle

5 Antworten

12

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

%Vor%

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

    
SirGuy 09.04.2012, 15:00
quelle
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, damit das Symbol nur einmal für eine bestimmte Quelldatei definiert wird.

    
Jonathan Wood 09.04.2012 14:59
quelle
0

Nein, sie können nicht mehrfach definiert werden und deshalb haben Sie #ifndef Wächter und sollten sie benutzen.

Haben

%Vor%

in der b.h-Header-Datei bedeutet, dass Sie die Leiste neu definieren. Wenn du #ifndef Wachen eingeschlossen hättest, würde das nicht passieren.

    
Lefteris 09.04.2012 14:59
quelle
0

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

    
Jason Huntley 09.04.2012 14:59
quelle
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 die Freigabe dieser Strukturen kein Problem ist, da sie kompiliert werden zum selben Speicherlayout

    
mensi 09.04.2012 15:00
quelle

Tags und Links