[英]C Macro Arguments including comma
我想使用另一個宏將 2 arguments 傳遞給一個宏:
#define A_AND_B 5,1
#define ADD(a, b) a + b
int add_them(void)
{
int result = ADD(A_AND_B);
return result ;
}
我希望擴展到
int result = 5 + 1;
我得到 6. 相反我得到
Error 'ADD' undeclared (first use in this function)
Error macro "ADD" requires 2 arguments, but only 1 given
有沒有解決的辦法?
通常情況下,您需要額外的(宏)間接級別:
#define A_AND_B 5,1
#define ADD(...) ADD_(__VA_ARGS__)
#define ADD_(a, b) a + b
int add_them(void)
{
int result = ADD(A_AND_B);
return result ;
}
ADD
被定義為可變參數,因此它將作為ADD(A_AND_B)
或ADD(A, B)
工作。
這是有效的,因為在掃描替換體中的宏之前, ADD
替換體中的__VA_ARGS__
被替換為實際的 arguments。
根據 C 2018 6.10.3.1,編譯器首先將 arguments 識別為類函數宏,然后對 arguments 執行宏替換,然后對類函數宏進行宏替換。 這意味着,在ADD(A_AND_B)
中,參數在被替換為5,1
之前被標識為A_AND_B
。 由於宏調用只有一個參數,而宏被定義為有兩個參數,因此診斷出錯誤。
鑒於您對ADD
的定義,無法在符合 C 標准的編譯器中更改此行為。
您可以改用另一個宏來擴展 arguments 並應用所需的宏:
#define Apply(Macro, Arguments) Macro(Arguments)
然后int result = Apply(ADD, A_AND_B);
將工作。 這會將ADD
和A_AND_B
識別為 arguments 以Apply
。 然后它將擴展那些,產生不變的ADD
和5,1
。 然后Apply
的宏替換生成ADD(5,1)
。 然后再次處理宏替換,以普通方式替換ADD(5,1)
。
請注意,好的做法通常是將ADD
定義為#define ADD(a, b) ((a) + (b))
以避免與使用該宏的其他運算符發生意外交互。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.