1. 程式人生 > >巨集定義中##符號的作用

巨集定義中##符號的作用

在巨集定義中,經常會遇到使用##符號,這個符號到底什麼作用呢?今天這裡簡單的說明下:

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



以下是新增##之後的例子