2016-11-25 27 views
-3

我正在測試相同代碼的兩個版本(在Linux上GCC版本4.9.2,沒有參數)。GCC在#define中需要下劃線?

兩者都有#define指令,後面跟着一對#ifdef/#endif對。

現在,事實證明,只有當初始#define之後的標籤以下劃線開頭時,組合才能正常工作。如果沒有下劃線,它會以非常奇怪的方式運作......只有每三次。

換句話說,這個工程

#define _whatever 

雖然這並不:

#define whatever 

即使我知道如何使該指令工作,只是好奇 - 這是否行爲遵循任何標準?

編輯: 下面的請求,這裏有兩個絕對真實的例子。 這一個打印行「預處理器的工作原理」:

#define _whatever 
#include <stdio.h> 
void main() 
{ 
#ifdef _whatever 
printf("Preprocessor works \n"); 
#endif 
} 

...這一個不輸出任何東西:

#define whatever 
#include <stdio.h> 
void main() 
{ 
#ifdef whatever 
printf("Preprocessor works \n"); 
#endif 
} 

是的,我甚至用的是「什麼」的字面 - 我不認爲,它是在其他地方定義的。但是,再次,這是使標籤有效的下劃線。

+1

您不顯示工作或停止工作的代碼部分是什麼。 –

+2

請提供[mcve]。 – user694733

+0

好吧,真實的例子: – vanhemt

回答

0

在任何已知版本的gcc中,絕對沒有要求預處理器宏以下劃線開頭的要求。

作爲一般規則,以各種下劃線組合開頭的預處理器宏保留給實現,並建議用戶忽略它們。所以#define whatever#ifdef whatever絕對必須工作。

我同意這是一個莫名其妙的令人沮喪的問題。有一些奇怪的事情發生,但無論解釋是什麼,並不是gcc需要前導下劃線。

-1

好吧,所以答案是 - 我對工具的sl command命令。

具體做法是:

(1)I是使用頭文件添加/刪除#define指令

(2)I人通過使用(無意識)彙編的報頭 「GCC *」代替「gcc * .c」

(3)偶爾出現編譯的* .h.gch文件解釋結果。

所以,似乎不穩定的行爲實際上是我(無意識地)不時刪除* .h.gch。

謝謝大家 - 我從所有答覆中學到了很多東西。