C++ 宏定義#define 中##的使用


在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;
}

 



如有不對的地方歡迎各位批評指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM