簡體   English   中英

C 宏 Arguments 包括逗號

[英]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); 將工作。 這會將ADDA_AND_B識別為 arguments 以Apply 然后它將擴展那些,產生不變的ADD5,1 然后Apply的宏替換生成ADD(5,1) 然后再次處理宏替換,以普通方式替換ADD(5,1)

請注意,好的做法通常是將ADD定義為#define ADD(a, b) ((a) + (b))以避免與使用該宏的其他運算符發生意外交互。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM