巨集定義中##符號的作用
在巨集定義中,經常會遇到使用##符號,這個符號到底什麼作用呢?今天這裡簡單的說明下:
1. ##
名稱:記號粘帖操作符(token paste operator)
作用:##先變成空格,將字元分隔開來,然後再將字元連線起來。
在巨集定義中,前處理器一般把空格解釋為分段標誌,對每一段進行比較,與前面相同的,就進行替換。但是如果用空格隔開,就不太好看,所以可以用##來代替空格。
比如 #define A(a) s a
#define A(a) s##a
1)先將##替換為空格,然後再來根據空格來把待替換的字元分段,如果某個段與前面相同,則進行替換。
2)另外,待替換的字元段,也可以用+, - * /, , ()等進行分段。
逗號 ,
括弧 ()
##
## 這裡##前面有多個空格
例子
直接演示空格
2. 可變引數中,##也起作用了
#define debug(format, ...) fprintf(stderr, format , __VR_ARGS__)
#define DEBUG(format, args...) fprintf(stderr,format, args)
debug("error\n");
預編譯解釋為:
fprintf(stderr,"error\n",);
這個由於後面多了一個逗號,所以編譯無法通過。
解決方法,加上##符號, ##符號的作用,就是當...為空時,消除前面那個逗號。
#define debug(format, ...) fprintf(stderr, format , ##__VR_ARGS__)
#define DEBUG(format, args...) fprintf(stderr,format, ##args)
debug("error\n");
預編譯解釋為:
fprintf("error\n");
gcc -E define##space.c -o a.i
以下是新增##之後的例子