2010-11-26 113 views
5

我需要編寫一些代碼來驗證宏是否已定義但沒有任何值。測試不需要編譯時間。測試C宏的值是否爲空

我試圖寫:

#if (funcprototype == "") 
MY_WARN("funcprototype is empty"); 
#endif 

代碼不能編譯,因爲funcprototype擴展到空。

+0

該測試不需要編譯時測試,但是您想在`#if`指令中使用結果?如果`funcprototype`有一個非空的替換列表,但在替換後它會擴展爲空(由於重新掃描)。 – 2010-11-26 19:02:16

+0

這似乎是http://stackoverflow.com/questions/4102351/test-for-empty-macro-definition – 2010-11-26 19:04:21

回答

5

如果運行時檢查是好的,那麼你可以測試stringized更換長度:

#define REAL_STRINGIZE(x) #x 
#define STRINGIZE(x) REAL_STRINGIZE(x) 

if (STRINGIZE(funcprototype)[0] == '\0') { 
    // funcprototype expanded to an empty replacement list 
} 
else { 
    // funcprototype expanded to a non-empty replacement list 
} 

我不認爲有一種普遍的情況「是這個宏通過替換爲空令牌序列「編譯時檢查。這是一個類似的問題,「是否可以比較兩個令牌的平等序列」,這在編譯時是不可能的。