C++ 宏定义#define 中##的使用
2017-07-05 11:23
405 查看
在C++的宏定义中,符号##一般是用于连接,包括参数的连接,参数与标识符的连接等,然后形成一个新的标识符。
下面举几个例子来进行说明。
eg1:
或者不用#define ab "123456",直接在main函数中定义一个string ab="123456"也是可以的。
eg2:
参数 __VA_ARGS__ 的使用;
参数 __VA_ARGS__ 一般用于代替宏定义中的参数,或者说是没有明确命名的参数:
举例说明:
输出为:
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()等,此时可以使用##来做相应的处理,具体做法为:
如果不使用##的话就需要这样进行处理:
如有不对的地方欢迎各位批评指正。
下面举几个例子来进行说明。
eg1:
#define ADD(a,b) a##b #define ab "123456" int main() { string str=ADD(a,b); //ADD(a,b)结果为ab,此时str=ab std::cout<<str<<std::endl; // #define ab "123456" 将ab定义为"123456",所以,str="123456" return 0; }
或者不用#define ab "123456",直接在main函数中定义一个string ab="123456"也是可以的。
eg2:
参数 __VA_ARGS__ 的使用;
参数 __VA_ARGS__ 一般用于代替宏定义中的参数,或者说是没有明确命名的参数:
举例说明:
#define DECLEAR(Var1,...)\ int judge=0;\ int m##Var1=1;\ int n##__VA_ARGS__=2;\ int main() { DECLEAR(INT,REPEATED); if(judge==0) std::cout<<"hello1"<<std::endl; if(mINT==1) std::cout<<"hello2"<<std::endl; if(nREPEATED==2) std::cout<<"hello3"<<std::endl; return 0; }
输出为:
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; }
如有不对的地方欢迎各位批评指正。
相关文章推荐
- C++ 宏定义#define 中##的使用
- C++中如何更好使用宏定义#define
- #(井号)在C/C++的#define宏定义中的特殊用法
- C/C++ 中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法大全、使用技巧
- 宏定义#define括号使用的深入认识
- 【C++】灵活使用C/C++宏定义
- c++中的续行符 \和宏定义的结合使用
- 在c/c++ 使用宏定义 注释 //
- C++工程中常用的宏定义(#define)
- c++中 宏定义(#define)的用法
- C++使用宏定义单例模式
- C++基础:#define宏定义和inline,const,enum的区别
- c++ 尽量不要使用#define 而是用const、enum、inline替换。
- 为什么 C++ 中提倡尽量避免使用宏 #define(转)
- C/C++中复杂宏定义中,使用两个#号和一个\的使用
- C++尽量不要使用#define
- #define 宏定义的使用方法详解
- 在c++中尽量使用const,enmu,inline来代替#define
- C\C++ 使用do{...}while(0)进行宏定义的好处!!!
- 宏定义#define的使用