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

 



如有不对的地方欢迎各位批评指正。

转载于:https://www.cnblogs.com/CLfei/p/7119743.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值