2012-03-19 29 views
2

我遇到了一個奇怪的情況。我的理解是,如果我已將#ifndef #define #endif標誌放入所有.h文件,那麼包含頭文件的順序並不重要。預期' - '標記之前的非限定標識

舊代碼 A.H

#ifndef A_H 
#define A_H 
    blah blah blah 
#endif 

a.cc

#include "a.h" 
blah blah blah 

而且上面的代碼工作得很好。

現在我添加了一個新的頭b.h

b.h

#ifndef B_H 
#define B_H 
    blah blah blah 
#endif 

新a.cc

#include "a.h" 
#include "b.h" 
blah blah blah 

以上a.cc編譯OK。但是,如果我改變a.cc到

新a.cc版本2

#include "b.h" 
#include "a.h" 
blah blah blah 

編譯失敗,錯誤:之前的預期不合格的ID「 - 」標記。

對不起,我不能在一個小例子中重現相同的錯誤。編譯錯誤導致了一個大項目。如果我在上面創建的一個小例子中進行測試。它編譯,但如果我切換回該項目。 #include指令順序很重要。我不知道這個問題可能發生在哪裏。任何人都可以給我一個線索將是很有幫助的。 在此先感謝

[已解決] 我已經自己解決了這個問題。然而我認爲也可能有其他人也會堅持下去。造成這個問題的原因是類似以下

在test.cc

const int var_undef = -1; 
#define var_undef (-1) 

它編譯,而如果換成這兩條線路

#define var_undef (-1) 
const int var_undef = -1 

它編譯預計unqualified-錯誤正如我所述,在' - '標記之前的標識。

+2

'#include'本質上只是一個複製粘貼過程,所以包含順序可能很重要。請工作來製作一個最小的測試用例,否則我們不能提供更多的幫助。 – 2012-03-19 11:49:10

+0

頭文件包含順序無關緊要,除非你在相互混合的東西 – 2012-03-19 11:50:18

+0

如果頭文件包含'#define'宏,或者在'b.h'的末尾有一些錯誤,那麼順序*就會*重要。或許缺少';'或'}'? – 2012-03-19 11:51:14

回答

3

當然,包括訂單事項。 include指令基本上覆制了當前翻譯單元中標題的內容。如果在a.h中定義了b.h所需的類型,則需要在b.h之前包括a.h,或者更好,還包括a.h,b.h

假設:

//a.h 
struct A 
{ 
}; 

//b.h 
struct B : public A 
{ 
}; 

//main.cc 
#include "a.h" 
#include "b.h" 
int main() 
{ 
    return 0; 
} 

AB之前定義這將彙編的罰款。翻譯部將主要是:

struct A 
{ 
}; 
struct B : public A 
{ 
}; 
int main() 
{ 
    return 0; 
} 

但是,如果你相反順序包括,你會得到:

struct B : public A 
{ 
}; 
struct A 
{ 
}; 
int main() 
{ 
    return 0; 
} 

這顯然是一個錯誤。

然而,這樣做的最正確的方法是,包括a.hb.h

//b.h 
#include "a.h" 
struct B : public A 
{ 
}; 

這樣一來,誰想包括b.h,用戶無需擔心其他頭。

相關問題