2017-03-06 2 views
0

Also konvertiere ich meinen Code in eine neue Struktur, die Header-Dateien verwendet (ich sollte beachten, dass ich sie nicht oft verwende) und ich habe Probleme, es zu kompilieren (mit gcc --std = c11). Ich denke, ich weiß, was das Problem ist, ich weiß einfach nicht, wie man den Code implementiert, um es zu beheben.Header mit struct und enums ineinander?

Hier ist ein Code, der das Problem beschreibt.

main.c

#include "file1.h" 
#include "file2.h" 
#include "header.h" 

int main() 
{ 
    BigStruct bigStruct; 

    DoStuff(&bigStruct); 
    OtherStuff(&bigStruct); 

    return 0; 
} 

file1.h

#ifndef FILE1_H 
#define FILE1_H 

#include "header.h" 

typedef enum TagMyEnum 
{ 
    MY_THING1, 
    MY_THING2, 

    MY_ENUM_END 
} 
MyEnum; 

typedef struct TagMyStruct 
{ 
    // Variables. 
} 
MyStruct; 

typedef struct TagBigStruct BigStruct; 

void DoStuff(BigStruct *bigStruct); 

#endif 

file2.h

#ifndef FILE2_H 
#define FILE2_H 

#include "header.h" 

typedef enum TagOtherEnum 
{ 
    OTHER_THING1, 
    OTHER_THING2, 

    OTHER_ENUM_END 
} 
OtherEnum; 

typedef struct TagOtherStruct 
{ 
    // Variables. 
} 
OtherStruct; 

typedef struct TagBigStruct BigStruct; 

void OtherStuff(BigStruct *bigStruct); 

#endif 

header.h

#ifndef HEADER_H 
#define HEADER_H 

#include "file1.h" 
#include "file2.h" 

typedef struct TagMyStruct MyStruct; 
typedef struct TagOtherStruct OtherStruct; 

typedef struct TagBigStruct 
{ 
    MyStruct myStruct[MY_ENUM_END]; 
    OtherStruct otherStruct[OTHER_ENUM_END]; 
} 
BigStruct; 

#endif 

Der Compiler sagt mir das.

In file included from file1.h:4:0, 
       from main.c:2: 
header.h:12:23: error: ‘MY_ENUM_END’ undeclared here (not in a function) 
    MyStruct myStruct[MY_ENUM_END]; 

Jetzt denke ich, ich verstehe den Fehler, ich weiß nur nicht, wie man eine Lösung implementieren.

Antwort

1

Header.h benötigt MY_ENUM_END aber ist im Preis inbegriffen ist, bevor die Definition von MyEnum in file1.h

Dieser Aufruf zirkuläre Abhängigkeit

Einfache

#ifndef FILE1_H 
#define FILE1_H 

typedef enum TagMyEnum 
{ 
    MY_THING1, 
    MY_THING2, 

    MY_ENUM_END 
} 
MyEnum; 

#include "header.h" 

// ... 

Das Gleiche gilt für file2.h beheben ist.

Am besten redesignieren Sie Ihre Header, um Querverweise zwischen ihnen zu vermeiden.

+2

Eine weniger einfache, aber korrektere Lösung wäre es, diese schreckliche Abhängigkeit zwischen den 3 Dateien loszuwerden. Entweder vereinigen Sie sie oder trennen Sie sie richtig. – StoryTeller

+0

Danke. Ich entfernte #include "header.h" aus file1.h und file2.h, und das behob das Problem auch. Ist das eine bessere Lösung oder eleganter? –

+0

@StoryTeller Ja, sicher. Ich schrieb das in der Zwischenzeit. – LPs