打印宏无法连接

时间:2018-07-18 11:37:33

标签: c++ macros

我想创建一个可以打印一些信息的宏,并在需要时使用任意数量的参数来打印其他消息。

这是一个我正在谈论的代码段:

#include <stdio.h>

#define print(msg, ...) \
    printf("Line: %d File %s "## msg, __LINE__ , __FILE__, __VA_ARGS__);

int main()
{
    print("Msg: %d", 13);
    print("Msg: %d, Msg2: %d", 123, 234);
}

这是我遇到的错误:

main.cpp:12:9: error: pasting ""Line: %d File %s "" and ""Msg: %d"" does not give a valid preprocessing token
  printf("Line: %d File %s "## msg, __LINE__ , __FILE__, __VA_ARGS__);

我在做什么错了?

2 个答案:

答案 0 :(得分:2)

C字符串文字会自动连接。您现在拥有的##用于将两个“令牌”(不是字符串)连接为一个,例如将ABCXYZ设为ABCXYZ作为标识符。

您想要这个:

printf("Line: %d File %s " msg, __LINE__ , __FILE__, __VA_ARGS__);

答案 1 :(得分:2)

确切地说:"Line: %d File %s ""Msg: %d"不是单个有效的预处理令牌,因为必须生成##

只需丢弃##,因为预处理器已经连接了相邻的字符串文字。