1 #include<stdio.h> 2 #define ADD_TO_SUM(sum_number,value) sum ## sum_number += value 3 4 5 int main() 6 { 7 ADD_TO_SUM(5 , 25); 8 }
注意此代碼不可以生成可執行文件,我的編譯環境是gcc,首先我創建一個ceshi.c文件,然后執行gcc -E -o ceshi.c ceshi.i
生成ceshi.i文件,我打開:貼上截圖!
可以看見主函數里面是替換成sum5 += 25的了,直接將未定義的sum和sum_number連接到一起了,value也被替換成25:
注意!不可以編譯生成可執行文件,因為我編譯后的圖片貼上!
想要體驗編譯的感覺的話,我找到類似回答:
##在C/C++中具有連接字符串的作用。例如:
執行完A ## B后變為AB(連接A和B並去掉空格)。
下面通過具體實例來說明##的工作原理:
假設程序中已經定義了這樣一個帶參數的宏:
#define paster( n ) printf( "token" #n " = %d", token##n )
同時又定義了一個整形變量:
int token9 = 9;
現在在主程序中以下面的方式調用這個宏:
paster(9);
那么在編譯時,上面的這句話被擴展為:
printf( "token" "9" " = %d", token9 );
注意到在這個例子中,paster(9);中的這個”9”被原封不動的當成了一個字符串,與”token”連接在了一起,從而成為了token9,而#n也被”9”所替代。
可想而知,上面程序運行的結果就是在屏幕上打印出token9=9
此處的token9由於是被定義了的,可以編譯,可以順便跑下gcc。
雖然不知道有什么用,但是還是記一下,萬一哪天自己還需要看呢!