在宏中使用char * variable的值

时间:2013-08-22 11:44:46

标签: c++ c macros c-strings

我可以拥有这样的东西吗?

#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

3 个答案:

答案 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));