2015-05-19 27 views
3

想我在編譯期間通過-D通過宏DEFS:在運行時檢查宏值

% gcc -DDEF1=ABC -DDEF2=DEF ... 

現在,我需要檢查在運行時DEF1或DEF2的價值,然而,這並不工作:

#if DEF1==ABC 
... 
#else 
... 
#endif 

我在做什麼錯?是否有可能實現我所需要的? 謝謝。

+0

可能重複(http://stackoverflow.com/questions/18278868/string-comparison-in-preprocessor-conditions-in-c) – hugomg

回答

4

現在,我需要檢查DEF1或DEF2的值在運行時,

那是不可能的。即使在編譯之前,預處理器宏的值也會被處理。

您可以將處理器宏轉換爲變量的值,並在運行時檢查變量的值。

沿着以下幾行的東西應該工作。

#define STR2(x) #x 
#define STR(X) STR2(X) 

char const* str = STR(DEF1); 

if (strcmp(str, "ABC") == 0) 
{ 
    // Process "ABC" 
} 
else if strcmp(str, "DEF") == 0) 
{ 
    // Process "DEF" 
} 
2

你的意思是在編譯時,不是嗎?運行時間if是沒有散列符號的運行時間。

#if的宏表達式被評估爲整數,而未定義的宏表達式默認爲零。

我不知道你想完成什麼,但如果你的宏的值在源中定義你對他們進行切換與#if之前,你可以做這樣的事情:

#define APPLE 1 
#define ORANGE 2 
#define PEAR 3 

#if FRUIT==APPLE 
    const char *fname = "Apple"; 
#elif FRUIT==PEAR 
    const char *fname = "Pear"; 
#elif FRUIT==ORANGE 
    const char *fname = "Orange"; 
#else 
    #error "Must specify a valid FRUIT" 
#endif 

中當然,當你的宏是可能值之一的數字值或恰好擴展到相同值的另一個宏時,也可以進行選擇,這可能會導致意外。

2

一個宏被預處理器擴展爲普通的C源代碼,從那時起使用。例如,如果您有一個宏應該是#defined,那麼您可以像運行其他編號一樣在運行時檢查其值。

if (MY_NUMBER == 42) 
    printf("MY_NUMBER is 42\n"); 
else 
    printf("MY_NUMBER is not 42 but rather %d\n", MY_NUMBER); 

但是,如果您的宏擴展到骯髒的東西,你想檢查該文本,你就必須給宏轉換爲字符串,然後看看該字符串。例如:

if (strcmp(STRINGIZE(MY_MACRO), "for (;;)") == 0) 
    printf("MY_MACRO was #define'd to an infinite loop."); 

如果您以前沒有看到過,「串化」宏的常用技巧如下所示。

#define STRINGIZE_R(X) #X 
#define STRINGIZE(X) STRINGIZE_R(X) 
[在預處理條件下用C字符串比較]的