本文截取自:https://blog.csdn.net/boring_wednesday/article/details/78756696
#的用法
首先要理解一個(gè)原則,即鄰近字符串連接原則
在C語(yǔ)言中
printf(“hello”” world!”“\n”);
這句話是合法的
打印結(jié)果為:
hello world!
按照上述原則,我們可以寫出下列代碼:
#define PRINT(FORMAT, VALUE) printf("the value of " #VALUE " is "FORMAT"\n", VALUE)
int main()
{
int i = 0;
PRINT("%d", i + 3);
return 0;
}
看下gcc編譯后的代碼,程序正常運(yùn)行。

20171209173118273.png
再通過(guò)gcc生成test.i文件看下預(yù)處理是怎么樣的:

20171209173520670.png
所以我們可以看出來(lái)#的作用:
將一個(gè)宏參數(shù)變成一個(gè)對(duì)應(yīng)的字符串
在上述例子中:
#VALUE被替換成了“i + 3”
別忘了被替換的時(shí)候i + 3兩邊加上了雙引號(hào)
##的用法
看下面的代碼片段
#define ADD_TO_AN(num, value) a##num += value
int main()
{
int a1 = 0;
int a2 = 0;
ADD_TO_AN(1, 5);
ADD_TO_AN(2, 6);
return 0;
}
解釋一下上面這段代碼
假設(shè)有一個(gè)變量叫a1
此時(shí)代碼片段為ADD_TO_AN(1, 5)
即替換為a1 += 5,給a1變量增加5
同理ADD_TO_AN(2, 6)則替換成a2 += 6
##的作用
將##兩邊的字符連在一起作為一個(gè)標(biāo)識(shí)符
前提連接后的標(biāo)識(shí)符必須合法,否則編譯出現(xiàn)標(biāo)識(shí)符未定義