#與 ##的使用含義與區別
簡單地說,#連接字符串,##連接兩個參數
在程序中擴展#define定義符號和宏時,需要涉及幾個步驟。
1、在調用宏時,首先對參數進行檢查,看看是否包含任何由#define定義的符號。如果是,它們首先被替換。
2、替換文本隨後被插入到程序中原來文本的位置。對於宏,參數名被他們的值替換。
3、最後,再次對結果文件進行掃描,看看它是否包含任何由#define定義的符號。如果是,就重復上述處理過程。
宏參數和#define定義可以包含其他#define定義的符號。但是,宏不可以出現遞歸。
## 連接符號由兩個#組成,其功能是在帶參數的宏定義中將兩個子串(token)聯接起來,從而形成一個新的子串。但它不可以是第一個或者最後一個子串。所謂的子串(token)就是指編譯器能夠識別的最小語法單元。
它可以拼接符號(Token-pasting operator)。
MSDN上有個例子:
#define paster( n ) printf( "token"#n" = %d\n", token##n )
int token9 = 100;
再調用 paster(9);宏展開後token##n直接合並變成了token9。整個語句變成了
printf( "token""9"" = %d", token9 );
在C語言中字符串中的二個相連的雙引號會被自動忽略,於是上句等同於
printf("token9 = %d", token9);。
即輸出token9 = 100