2013-10-25 45 views
3

我想定義可以採取另一種宏作爲一個參數,如果沒有定義它返回0宏,返回1,如果它是有沒有什麼辦法可以根據是否定義變量將變量轉換爲0或1?

預處理器操作稱爲defined這正是這一點,但它只是可在#if指令中獲得。我想知道我是否可以以某種方式在#if之外公開此功能,例如在一行C++代碼中。

這是一般可能的,如果是這樣,如何?

+1

您必須知道預處理器將所有未定義的宏視爲false。如果你真的需要的是條件編譯,你可以依靠它。 – 2013-10-25 20:17:47

+0

據我瞭解,你試圖檢查宏是否在運行時被定義,但是宏在預編譯時(在編譯之前)被擴展,所以這是不可能的。 – xorguy

+0

其實,我在編譯時需要它。這些宏將在編譯時在命令行上定義。我只是不想爲每個可能定義的變量添加一個新的宏塊。 – merlin2011

回答

8

我瞭解你想要的東西像下面這不可能遺憾的是:

#define IS_DEFINED_MACRO(X) #ifdef(X) 1 #else 0 #endif // IMPOSSIBlE! 

int x = IS_DEFINED_MACRO(MACRO_TO_TEST); 

唯一可能的途徑是

#ifdef MACRO_TO_TEST 
    #define IT_IS_DEFINED 1 
#else 
    #define IT_IS_DEFINED 0 
#endif 
1

我看了您的評論「恰恰使宏這是爲了實際的C++代碼的目的,在命令行上未定義的默認值可以爲0「。

一兩件事你可以做的僅僅是對每個相應的宏定義的默認值:

#ifndef WIBBLE 
#define WIBBLE 0 
#endif 

然後當你編譯,你可以選擇通過-DWIBBLE=100編譯器覆蓋默認值。

+0

這是爲每個宏添加3行代碼。我試圖避免這樣做,因爲#可能的宏可能很大。 – merlin2011

+1

@ merlin2011:配置程序的許多功能是編寫一個config.h文件的代碼,以便程序員不需要輸入過多的內容。 –

相關問題