2015-04-08 50 views
1

我有以下文件:範圍的#define的無令牌字符串在C/C++

MAIN.C

#include "Header.h" 

#define SECRET_NUMBER_ENABLED 

int main() 
{ 
    printf("Secret number = %d\n", SECRET_NUMBER); 
    return 0; 
} 

Header.h

#ifdef SECRET_NUMBER_ENABLED 
    #define SECRET_NUMBER 111 
#else 
    #define SECRET_NUMBER 222 
#endif 

打印結果爲:222

據我的理解,預處理器應該掃描Main.c,並將每個SECRET_NUMBER替換爲Header.h中定義的號碼,

而且由於SECRET_NUMBER_ENABLED在Main.c中定義,所以預處理器應該採用111定義而不是222

顯然我錯了,但我不知道爲什麼,不知道如何正確設置它,以便只有中的#define SECRET_NUMBER_ENABLED將使用SECRET_NUMBER 111

+0

是否嘗試在'#include'之前放置'#define SECRET_NUMBER_ENABLED'? – CrApHeR

+0

是的,同樣的結果,雖然我得到編譯警告:警告C4603:'SECRET_NUMBER_ENABLED':宏沒有定義或定義是不同的預編譯頭使用 – amit

+0

我的完整代碼有以下內容: #include「stdafx.h」 #include「Header.h」 當我把它們之間的定義,它的工作原理,當我把2之前的定義包括我得到上面的警告,它不工作,你能解釋爲什麼嗎? – amit

回答

0

C文件假定包含「stdafx.h」之前的任何內容都已被定義。
請參閱Why stdfax.h should be the first include on MFC applications?

因此,任何早期的定義都會丟失。

這就是爲什麼你需要包括你自己的頭文件之前定義包括stdafx.h中
(因爲否則它們會被忽略)

  • 後您的宏


    • (否則他們不會有影響您的標題,
      您的標題中的#ifdef在看到main.c中的定義之前進行評估)