我一直在尝试在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__)
答案 0 :(得分:13)
除非至少有一个变量参数,否则会发生。您可以尝试使用此GNU扩展来修复它:
#define DBG(format, ...) printf("DEBUG: " #format "\n", ##__VA_ARGS__)
^^
正如in the GNU doc所说:
[if]使用宏时遗漏变量参数,然后 “##”之前的逗号将被删除。
答案 1 :(得分:0)
Check out this。它包含有关Variadic宏的信息,这是您正在使用的。
答案 2 :(得分:0)
为什么需要将格式串起来,它可以保持原样,只需在使用宏时将其视为字符串。
可以通过在 VA_ARGS
之前添加'##'来解决错误,因为cnicutar可以解决#define DBG(format, ...) printf("DEBUG: " format "\n", ##__VA_ARGS__)
用法示例:
DBG("%d - %s", a,b);