使用__VA_ARGS__定义字符串宏时出错

时间:2013-09-23 20:18:14

标签: c macros c-preprocessor variadic-macros stringification

我一直在尝试在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__)

3 个答案:

答案 0 :(得分:13)

除非至少有一个变量参数,否则会发生。您可以尝试使用此GNU扩展来修复它:

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

正如in the GNU doc所说:

  

[if]使用宏时遗漏变量参数,然后   “##”之前的逗号将被删除。

答案 1 :(得分:0)

MSDN上的

Check out this。它包含有关Variadic宏的信息,这是您正在使用的。

答案 2 :(得分:0)

为什么需要将格式串起来,它可以保持原样,只需在使用宏时将其视为字符串。

可以通过在 VA_ARGS

之前添加'##'来解决错误,因为cnicutar可以解决
#define DBG(format, ...) printf("DEBUG: " format "\n", ##__VA_ARGS__)

用法示例:

DBG("%d - %s", a,b);