12

我一直在尝试在 C 中实现一个函数宏,该函数宏在参数前面加上“DEBUG:”,并将其参数传递给 printf:

#define DBG(format, ...) printf("DEBUG: " #format "\n", __VA_ARGS__)

这在 gcc 中给了我这个错误:

src/include/debug.h:4:70: error: expected expression before ‘)’ token
#define DBG(format, ...) printf("DEBUG: " #format "\n", __VA_ARGS__)
                                                                   ^

据说,它应该对格式进行字符串化,并将其变量参数传递给 printf,但到目前为止我无法克服这个错误。


编辑

在放弃字符串化参数和双重哈希(##)之后,__VA_ARGS__我现在遇到了这个错误:

src/lib/cmdlineutils.c: In function ‘version’:
src/lib/cmdlineutils.c:56:17: warning: ISO C99 requires rest arguments to be used [enabled by default]
  DBG("version()");

我应该在参数后加逗号吗?

DBG("version()",);  // ?

作为参考,DBG() 现在看起来像这样:

#define DBG(format, ...) printf("DEBUG: " format "\n", ##__VA_ARGS__)
4

3 回答 3

20

除非至少有一个变量参数,否则会发生这种情况。你可以试试这个 GNU 扩展来修复它:

#define DBG(format, ...) printf("DEBUG: " #format "\n", ##__VA_ARGS__)
                                                        ^^

正如GNU 文档中所解释的

[如果] 使用宏时变量参数被省略,那么'##'之前的逗号将被删除。

于 2013-09-23T20:28:52.900 回答
0

在 MSDN 上查看此内容。它包含有关可变参数宏的信息,这是您正在使用的。

于 2013-09-23T20:22:13.040 回答
0

为什么需要对格式进行字符串化,它可以保持原样,在使用宏时将其视为字符串。

错误,如 cnicutar 所建议的,可以通过在VA_ARGS之前添加“##”来解决

#define DBG(format, ...) printf("DEBUG: " format "\n", ##__VA_ARGS__)

使用示例:

DBG("%d - %s", a,b);
于 2013-09-23T20:27:05.503 回答