Ich habe diesen Code:
main.h
und
my_struct.h
aber ich bekomme das, wenn ich versuche zu kompilieren: error: unknown type name ‘my_structure’
Irgendeine Idee warum?
Aufgrund der Art, wie Sie Ihre Includes bestellt haben, sieht der Compiler void some_func(my_structure *x);
, bevor er typedef struct abcd { int a; } my_structure;
sieht.
Ich denke.
Lassen Sie uns das durchgehen.
Wenn my_struct.h
zuerst verarbeitet wird, erhalten wir die folgende Sequenz von Ereignissen:
UTILSH
ist definiert MAINH
ist definiert UTILSH
bereits definiert ist, verarbeiten wir my_struct.h
nicht erneut, daher wird typedef nicht verarbeitet void some_func(my_structure *x);
wird verarbeitet. Nach der Vorverarbeitung sieht Ihr Compiler die folgende Sequenz von Deklarationen:
%Vor% Schlechter Juju. Sie benötigen entweder eine Vorwärtsdeklaration von my_structure
in main.h
, oder Sie müssen diese zirkuläre Abhängigkeit aufbrechen (was die bevorzugte Option ist). Gibt es irgendetwas in main.h
, das my_structure.h
tatsächlich benutzt? Wenn dies der Fall ist, sollten Sie es in eine separate Datei ausschließen, die sowohl main.h
als auch my_structure.h
enthält.
Sie haben eine kreisförmige Kopfzeile erstellt. Circular Inclusion erreicht nie etwas. Es ist unendlich. Der #ifndef
include guard unterbricht den unendlichen Einschluss-Kreis an einem unvorhersehbaren Punkt (abhängig davon, welcher Header zuerst in .c
file enthalten ist). Das ist in deinem Fall passiert. Im Grunde genommen wurde Ihre zirkuläre Inklusion in main.h
first und my_struct.h
second "aufgelöst". Deshalb weiß main.h
nichts über my_struct
type.
Auch hier erreicht die kreisförmige Aufnahme niemals etwas. Befreien Sie sich von der zirkulären Einschließung. Gestalten Sie Ihre Header-Struktur hierarchisch: Header niedrigerer Ebene, die in übergeordneten Headern enthalten sind, aber nie umgekehrt. In Ihrem Fall ist my_struct.h
wahrscheinlich ein untergeordneter Header, was bedeutet, dass Sie main.h
nicht mehr in my_struct.h
einfügen müssen. Redigieren Sie Ihre Header so, dass my_struct.h
nicht mehr main.h
benötigt.
Die Fehlermeldung kommt von main.h
, während sie in my_struct.h
enthalten ist, bevor my_structure
definiert ist. Sie sollten Ihre Include-Pfade überdenken, da sich main.h
und my_struct.h
gegenseitig einschließen.
Sie möchten wahrscheinlich, dass Ihre main.h
-Datei nur my_struct.h
enthält und my_struct.h
nichts enthält. Sie weisen Ihren C-Compiler im Wesentlichen an, eine unendliche Co-Include-Schleife zu haben.