我想基本上有一個宏縮短。如何在宏中擴展可變參數?
該宏,FOO(A,B,C)
應擴展爲 defined(_FOO_A) || defined(_FOO_B) || defined(_FOO_C)
。
GCC中使用可變參數宏而不是實際寫入3個函數(FOO(A)
,FOO(A,B)
,FOO(A,B,C)
)是可能的嗎?
我想基本上有一個宏縮短。如何在宏中擴展可變參數?
該宏,FOO(A,B,C)
應擴展爲 defined(_FOO_A) || defined(_FOO_B) || defined(_FOO_C)
。
GCC中使用可變參數宏而不是實際寫入3個函數(FOO(A)
,FOO(A,B)
,FOO(A,B,C)
)是可能的嗎?
它是不可能有一個宏擴展到一些包含defined
關鍵字:
如果令牌
defined
作爲這個替換 過程或使用defined
元運算符的結果產生不在宏替換之前不匹配 兩個指定表格之一,行爲是 未定義。
所以你不能這樣做defined
。如果您願意通過測試FOO_A_
,FOO_B_
的值來放寬該限制,則可以通過使用P99來執行此操作。 E.g只是在做邏輯或變量列表將
#if P99_ORS(A, B, C)
...
#endif
其中P99_ORS
表達擴展到
((((A) || (B))) || (C))
,然後爲#if
的表達進行評估。
有也將是如何擴大,首先進入你喜歡的令牌列表,如果你想要做一些宏編程
#define P00_NAME_X(NAME, X, I) P99_PASTE2(NAME, X)
#define CONDITION(NAME, ...) P99_ORS(P99_FOR(FOO_, P99_NARG(__VA_ARGS__), P00_SEQ, P00_NAME_X, __VA_ARGS__))
這樣
CONDITION(A, B, C, toto);
將擴大到
((((((FOO_A) || (FOO_B))) || (FOO_C))) || (FOO_toto));
像這樣?
#include <stdio.h>
#define FOO(A, B, C) (FOO_X(A) || FOO_X(B) || FOO_X(C))
#define FOO_X(x) defined(_FOO_##x)
// just to print it
#define QUOTE(...) QUOTE_AUX(__VA_ARGS__)
#define QUOTE_AUX(...) #__VA_ARGS__
int main(void)
{
puts(QUOTE(FOO(a, b, c)));
}
編輯:其實這個結果不確定的行爲,在所有的C類標準。
不幸的是,這是標準禁止的。'define'不允許出現在宏擴展中。 –
你說得對,我會將其添加到答案中,謝謝。 +1給你 – effeffe
以兩個下劃線或一個下劃線和一個大寫字母開頭的標識符被保留供l語言實施。 –
通常情況下,我會說寫一個遍歷參數的循環並檢查每個定義的...但是,如果在預處理器指令的上下文中使用了定義,則這是一個不可行的過程。 – RonaldBarzell
您提供的代碼是您在一般情況下需要的示例,或者您需要的是完全一樣的宏? – effeffe