1、問題
看到代碼宏裏面很多##__VA_ARGS__不知道什麼意思
2、直接寫測試代碼
#include <stdio.h>
#define my_printf(x) printf(#x" is %d\n", x)
#define my_printf1(x) printf("value is %d\n", x##x)
#define my_printf2(...) printf(__VA_ARGS__)
#define my_printf3(fmt, ...) printf(fmt, __VA_ARGS__)
#define my_printf4(fmt, ...) printf(fmt, ##__VA_ARGS__)
int main()
{
int a = 100;
my_printf(a);
int aa = 50;
my_printf1(a);
my_printf2("a is %d\n", a);
my_printf3("aa is %d\n", aa);
my_printf4("I am chenyu \n");
my_printf4("a is %d\n", a);
return 0;
}
運行結果
a is 100
value is 50
a is 100
aa is 50
I am chenyu
a is 100
3 分析#和##和__VA_ARGS__和##__VA_ARGS__
1) #
宏連接符,作變量鏈接
my_printf1方法x##x,因爲我們傳進去的是a,然後進行鏈接a,就是aa,恰好我們定義了aa,所以my_printf1方法打印50
2) ##
宏連接符,作變量鏈接
my_printf1方法x##x,因爲我們傳進去的是a,然後進行鏈接a,就是aa,恰好我們定義了aa,所以my_printf1方法打印50
3) __VA_ARGS__
這裏的__VA_ARGS__,是指打印宏裏面的可變參數,也就是函數參數裏面的... 所以my_printf3打印a is 100,由於這裏沒有fmt,所以調用my_printf3函數參數可以是一個,可以不是幾個參數中間用逗號隔開,但是在my_printf3裏面定義了fmt,也就是意味着這裏調用my_printf3函數的時候參數裏面必須要有逗號,如果my_printf3我們調用的時候這樣寫(不攜帶逗號),
my_printf3("I am chenyu \n");
那麼編譯的時候就會報錯如下
parse error before ')' token
所以這裏my_printf3函數裏面參數必須要要有逗號
4) ##__VA_ARGS__
如果my_printf3函數裏面參數沒有逗號的參數傳遞進去怎麼才能不出問題呢?我們可以使用##__VA_ARGS__ 你看我們my_printf4函數調用裏面就沒有攜帶逗號的參數也只有一個參數傳遞進去了,沒毛病,老鐵.
當然我們也可以攜帶多個參數傳遞到my_printf4裏面去,所以我們如果用宏定義可變參數,我們一般用##__VA_ARGS__