最近做一个公司项目,用到了一些宏定义的东东,发现了一个神奇的用法,故写日志纪念一下。
首先你需要知道C++宏定义的基本用法:
//拼接x和y ##
#define Conn(x,y) x##y
//加上单引号 #@
#define ToChar(x) #@x
//加上双引号 #
#define ToString(x) #x
不解释,网上一大堆。
有了以上三个宏定义,我现在想拼接两个字符串 比如"dede" "shuaige" 编程 "dedeshuaige" 怎么做呢。
作为英明神武的dede想到了一招
ToString(Conn(dede,shuaige))
这样对吗?Of cause wrong。 通过printf 我们可以看到输出的是 Conn(dede,shuaige)。
So ,how can you sovle this problem?
德德,很帅气的想到一招,先不告诉你,看下面代码
#define A(x) "dede" //为啥加个(x)这东西,不解释
#define STRING1 A(x)A(x)
#define STRING2 A(x)A(x)A(x)A(x)
#define STRING3 "dede""shuaige"
用printf输出是啥子呢?
From the result , the follow information can be easily proved.
STRING1:"dededede"
STRING2:"dededededede"
STRING3:"dedeshuaige"
既然如此,我们的宏定义咋个写呢,因为要带变量,德德的第一想法是:
<span style="font-size:18px;"></span><pre name="code" class="cpp">#define Conn(x,y) #x#y
Very good. 但是有个缺点啊 Conn(x,y)中x和y只能是一个不加双引号的字符串例如。
正确使用:Conn(dede,shuaige)
错误使用:Conn("dede","shuaige")
So 依然感觉有点多不足,个人感觉Conn("dede","shuaige")要爽一点。
经过千险万难,不多说了,直接开代码:
#define Conn(x,y) x""y
为了让宏把xy识别成x和y中间加个空串就OK了。