我想定義可以採取另一種宏作爲一個參數,如果沒有定義它返回0宏,返回1,如果它是有沒有什麼辦法可以根據是否定義變量將變量轉換爲0或1?
預處理器操作稱爲defined
這正是這一點,但它只是可在#if
指令中獲得。我想知道我是否可以以某種方式在#if
之外公開此功能,例如在一行C++代碼中。
這是一般可能的,如果是這樣,如何?
我想定義可以採取另一種宏作爲一個參數,如果沒有定義它返回0宏,返回1,如果它是有沒有什麼辦法可以根據是否定義變量將變量轉換爲0或1?
預處理器操作稱爲defined
這正是這一點,但它只是可在#if
指令中獲得。我想知道我是否可以以某種方式在#if
之外公開此功能,例如在一行C++代碼中。
這是一般可能的,如果是這樣,如何?
我瞭解你想要的東西像下面這不可能遺憾的是:
#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
我看了您的評論「恰恰使宏這是爲了實際的C++代碼的目的,在命令行上未定義的默認值可以爲0「。
一兩件事你可以做的僅僅是對每個相應的宏定義的默認值:
#ifndef WIBBLE
#define WIBBLE 0
#endif
然後當你編譯,你可以選擇通過-DWIBBLE=100
編譯器覆蓋默認值。
這是爲每個宏添加3行代碼。我試圖避免這樣做,因爲#可能的宏可能很大。 – merlin2011
@ merlin2011:配置程序的許多功能是編寫一個config.h文件的代碼,以便程序員不需要輸入過多的內容。 –
您必須知道預處理器將所有未定義的宏視爲false。如果你真的需要的是條件編譯,你可以依靠它。 – 2013-10-25 20:17:47
據我瞭解,你試圖檢查宏是否在運行時被定義,但是宏在預編譯時(在編譯之前)被擴展,所以這是不可能的。 – xorguy
其實,我在編譯時需要它。這些宏將在編譯時在命令行上定義。我只是不想爲每個可能定義的變量添加一個新的宏塊。 – merlin2011