C Unbekannter Typname 'my_structure'

8

Ich habe diesen Code:

main.h

%Vor%

und

my_struct.h

%Vor%

aber ich bekomme das, wenn ich versuche zu kompilieren: error: unknown type name ‘my_structure’

Irgendeine Idee warum?

    
alexandernst 19.09.2013, 19:28
quelle

3 Antworten

18

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:

  1. UTILSH ist definiert
  2. MAINH ist definiert
  3. Da UTILSH bereits definiert ist, verarbeiten wir my_struct.h nicht erneut, daher wird typedef nicht verarbeitet
  4. void some_func(my_structure *x); wird verarbeitet.
  5. Jetzt wird der Typedef 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.

    
John Bode 19.09.2013, 19:34
quelle
5

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.

    
AnT 19.09.2013 19:32
quelle
3

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.

    
yan 19.09.2013 19:30
quelle

Tags und Links