想我在編譯期間通過-D
通過宏DEFS:在運行時檢查宏值
% gcc -DDEF1=ABC -DDEF2=DEF ...
現在,我需要檢查在運行時DEF1或DEF2的價值,然而,這並不工作:
#if DEF1==ABC
...
#else
...
#endif
我在做什麼錯?是否有可能實現我所需要的? 謝謝。
想我在編譯期間通過-D
通過宏DEFS:在運行時檢查宏值
% gcc -DDEF1=ABC -DDEF2=DEF ...
現在,我需要檢查在運行時DEF1或DEF2的價值,然而,這並不工作:
#if DEF1==ABC
...
#else
...
#endif
我在做什麼錯?是否有可能實現我所需要的? 謝謝。
現在,我需要檢查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"
}
你的意思是在編譯時,不是嗎?運行時間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
中當然,當你的宏是可能值之一的數字值或恰好擴展到相同值的另一個宏時,也可以進行選擇,這可能會導致意外。
一個宏被預處理器擴展爲普通的C源代碼,從那時起使用。例如,如果您有一個宏應該是#define
d,那麼您可以像運行其他編號一樣在運行時檢查其值。
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字符串比較]的
可能重複(http://stackoverflow.com/questions/18278868/string-comparison-in-preprocessor-conditions-in-c) – hugomg