我可以拥有这样的东西吗?
#include <stdio.h>
#define CAT2(a1, a2) #a1 ## ";" ## #a2
int main(void)
{
const char *ch1 = "1";
const char *ch2 = "2";
puts(CAT2(ch1, ch2));
}
输出:
1; 2
但目前我有
ch1; ch2
答案 0 :(得分:2)
# operator
替换字符串文字给他的参数。
这意味着:
#define TO_STR(arg) #arg
const char* ch1 = "1";
TO_STR(ch1) // <- Will give "ch1"
来自标准:
16.3.2#运算符[cpp.stringize]
字符串文字是 string-literal ,没有前缀。如果在替换列表中,参数后面紧跟
#
预处理标记,则两者都被单个字符串文字预处理标记替换,该标记包含相应参数的预处理标记序列的拼写。 强>
因此,在您的情况下,您尝试连接(使用## operator
):
"ch1" ## ";" ## "ch2"
这解释了你得到的结果。
由于MACRO在预处理时进行评估,因此无法以您希望的方式连接变量。
如果你在C,你应该使用strcat
。
如果您使用的是C ++,为什么不使用std::string
,或者在C ++ 11中使用snprintf
。
答案 1 :(得分:1)
不幸的是,由于宏在编译时被评估,你不能使用变量的值,这是宏的主要限制因素。即他们无法评估运行时值。
答案 2 :(得分:1)
您无法以您希望的方式使用宏进行字符串连接。
使用snprintf准备字符串:
char tmp[20];
snprintf(tmp, sizeof(tmp), "%s;%s", ch1, ch2);
宏在编译时被扩展,在实际编译之前,它无法知道运行时值。
您可以将上面的代码包装到将返回tmp的函数中(只是不要忘记使用tmp静态变量来防止泄漏)。
char* cat2(char *ch1, char* ch2)
{
static char tmp[50];
snprintf(tmp, sizeof(tmp), "%s;%s", ch1, ch2);
return tmp;
}
// inside main
puts(cat2(ch1, ch2));