(1)#是把它后面的参数转换成一个字符串
#defineERROR(module) printf("error:"#module"\n")
ERROR(add); //输出error:add
(2) ##用来连接前后两个参数,把它们变成一个字符串。
#defineConn(x,y) x##y
intn=Conn(123,456);//结果就是n=123456;
##在Qt中的应用
#defineQ_DECLARE_PRIVATE(Class) \
inlineClass##Private*d_func()
{ returnreinterpret_cast<Class##Private*>(qGetPtrHelper(d_ptr));} \
inlineconstClass##Private*d_func()const
{returnreinterpret_cast<constClass##Private*>(qGetPtrHelper(d_ptr));}\
friendclassClass##Private;
例如Q_DECLARE_PRIVATE(Foo) 结果预处理后,就会变成:
inlineFooPrivate*d_func()
{ returnreinterpret_cast< FooPrivate*>(qGetPtrHelper(d_ptr));}
inlineconstFooPrivate*d_func()const
{returnreinterpret_cast<constFooPrivate*>(qGetPtrHelper(d_ptr));}
friendclassFooPrivate;
(3)宏定义do{ }while(0)
#defineswitch1(x,y)do{inttmp;tmp=x;x=y;y=tmp;}while(0)
inta=25;
intb=20;
if(a>b)
switch1(a,b);
else
;
为什么一定要一个do{}while(0)呢?
如果使用#defineswitch2(x,y){inttmp;tmp=x;x=y;y=tmp;}
把宏引入代码中,会多出一个分号,编译出现error:'else'withoutaprevious'if'
完整代码如下:
#include<iostream>
usingnamespacestd;
#defineERROR(module) printf("error:"#module"\n")
#defineConn(x,y) x##y
#defineswitch1(x,y)do{inttmp;tmp=x;x=y;y=tmp;}while(0)
#defineswitch2(x,y){inttmp;tmp=x;x=y;y=tmp;}
intmain()
{
ERROR(add);
intn=Conn(123,456);//结果就是n=123456;
cout<<n<<endl;
inta=25;
intb=20;
if(a>b)
switch1(a,b);
else
;
return0;
}
参考博客:http://www.cnblogs.com/Anker/p/3418792.html