在C++的宏定義中,符號##一般是用於連接,包括參數的連接,參數與標識符的連接等,然后形成一個新的標識符。
下面舉幾個例子來進行說明。
eg1:
1 #define ADD(a,b) a##b 2 #define ab "123456" 3 int main() 4 { 5 string str=ADD(a,b); //ADD(a,b)結果為ab,此時str=ab 6 std::cout<<str<<std::endl; // #define ab "123456" 將ab定義為"123456",所以,str="123456" 7 return 0; 8 }
或者不用#define ab "123456",直接在main函數中定義一個string ab="123456"也是可以的。
eg2:
參數 __VA_ARGS__ 的使用;
參數 __VA_ARGS__ 一般用於代替宏定義中的參數,或者說是沒有明確命名的參數:
舉例說明:
1 #define DECLEAR(Var1,...)\ 2 int judge=0;\ 3 int m##Var1=1;\ 4 int n##__VA_ARGS__=2;\ 5 6 int main() 7 { 8 DECLEAR(INT,REPEATED); 9 if(judge==0) 10 std::cout<<"hello1"<<std::endl; 11 if(mINT==1) 12 std::cout<<"hello2"<<std::endl; 13 if(nREPEATED==2) 14 std::cout<<"hello3"<<std::endl; 15 return 0; 16 } 17
輸出為:
hello1
hello2
hello3
說明:
(1)#define(Var1,...)說明該宏定義至少會接收一個參數,后面的"..."可以認為是很多個參數,但是沒有命名
(2)int m##Var1=1:這里的操作是將m於Var1進行連接組成一個新的標識符,,mian函數中,調用DECLEAR(INT,REPEATED),所以,Var1為INT,m##Var1組成的新標識符即為mINT=1;
(3)int n##__VA_ARGS__=2: 這里使用到了參數__VA_ARGS__, 該參數的作用一般標識未命名的標識符,在main中,DECLEAR(INT,REPEATED)傳兩個參數,但是DECLEAR宏定義時只有一個參數Var1,其余用"..."表示,此時,__VA_ARGS__的作用就是用於表示"..."代表的參數,這里也就是REPEATED, 所以int n##__VA_ARGS__=2也就是int nREPEATED=2;
(4)宏定義中每一句代碼后面跟\表示換行,一定要注意,"\"后面不要跟任何字符,空格也不可以有。包括注釋"\\"或者/* */
##的使用現在我遇到的是可以減少代碼量,使用#define代替部分函數,這樣可以實現函數的復用。舉例來說明:
比如有不同的case,要對不同的數據類型就行處理但是處理方法都一樣,對應的函數分別為: GetInt(),GetDouble(),GetUInt()等,此時可以使用##來做相應的處理,具體做法為:
#define GETDATA(TYPE,...)\ case TYPE: \ {\ data=Get##TYPE(...)\ ....\ }break;\ 調用的時候處理為: switch(TYPE) { GETDATA(TYPE,...); }
這樣即可。
如果不使用##的話就需要這樣進行處理:
switch(TYPE) { case Int: { data=GetInt(...); ... }break; case Double { data=GetDouble...); .... }break; case U_Int: { data=GetU_Int(....); .... }break; }
如有不對的地方歡迎各位批評指正。