2017-03-06 29 views
0

因此,我將我的代碼轉換爲使用頭文件的新結構(我應該注意,我不經常使用它們),並且無法編譯它(使用gcc --std = c11)。我想我知道問題是什麼,我只是不知道如何執行代碼來修復它。在彼此中使用struct和枚舉的頭文件?

下面是一些描述問題的代碼。

的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 

編譯器告訴我這一點。

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

現在我想我理解錯誤,我只是不知道如何實施解決方案。

回答

1

Header.h需要MY_ENUM_END,而是包含在file1.h

的的MyEnum定義之前,這就是呼叫循環依賴

容易解決

#ifndef FILE1_H 
#define FILE1_H 

typedef enum TagMyEnum 
{ 
    MY_THING1, 
    MY_THING2, 

    MY_ENUM_END 
} 
MyEnum; 

#include "header.h" 

// ... 

同樣的事情file2.h。

最好重新設計您的標題,以避免它們之間的交叉引用。

+2

不太容易,但更正確的解決方法是擺脫3個文件之間的這種可怕的依賴關係。要麼將它們聯合起來,要麼將它們分開。 – StoryTeller

+0

謝謝。我從file1.h和file2.h中刪除了#include「header.h」,這也解決了這個問題。這是更好的解決方案還是更優雅? –

+0

@StoryTeller是的,當然。我正在寫這篇文章。 – LPs