C語言之#和##和__VA_ARGS__和##__VA_ARGS__

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__

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章