2

我正在尝试编写最简单的 log_debug 宏:

#define log_debug(fmt, ...) printf("%s:%d "##fmt, __FILE__, __LINE__, __VA_ARGS__);

主要原因是获取行号和文件名。但不知何故它不起作用(编译错误):

error: pasting ""%s:%d "" and ""error value: %d\n"" does not give a valid preprocessing token

你能给我一个线索还有没有其他方法可以重写它?

4

3 回答 3

3

该错误是因为串联会产生:

 "%s:%d""error value: %d\n"

这是两个标记,而不是串联所期望的单个标记。

在这种情况下,您实际上不需要##,因为连续的字符串文字是隐式连接的:

... printf("%s:%d " fmt,  ...
于 2013-07-30T07:06:40.817 回答
3

当然,在 C 中,相邻的字符串文字会自动连接。怎么样

#define log_debug(fmt, ...) printf("%s:%d " fmt, __FILE__, __LINE__, __VA_ARGS__)
                                           ^^ '##' removed
于 2013-07-30T07:03:44.470 回答
2

也许你应该尝试类似

#define log_debug_(FILE, LINE, fmt, ...) printf(FILE ":" #LINE ": " fmt, __VA_ARGS__)
#define log_debug(fmt, ...) log_debug_(__FILE__, __LINE__, fmt, ...)

实际上,这只是在您的格式字符串前面加上另一个可以在编译时确定的字符串。

于 2013-07-30T07:14:03.113 回答