我想创建一个可以打印一些信息的宏,并在需要时使用任意数量的参数来打印其他消息。
这是一个我正在谈论的代码段:
#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__);
我在做什么错了?
答案 0 :(得分:2)
C字符串文字会自动连接。您现在拥有的##
用于将两个“令牌”(不是字符串)连接为一个,例如将ABC
和XYZ
设为ABCXYZ
作为标识符。
您想要这个:
printf("Line: %d File %s " msg, __LINE__ , __FILE__, __VA_ARGS__);
答案 1 :(得分:2)
确切地说:"Line: %d File %s ""Msg: %d"
不是单个有效的预处理令牌,因为必须生成##
。
只需丢弃##
,因为预处理器已经连接了相邻的字符串文字。