我有一个宏。
#define debug(fmt, ...) printf("%lu %s:%s:%i " fmt, ms(), __FILE__, __func__, __LINE__, __VA_ARGS__)
我有一个宏,可以做我想做的事。
我可以用以下方法调用它
debug("i: %i\n", i);
来打印 i
.
我的问题是,我不能叫它与。
debug("got here");
因为那会扩展成:
printf("%lu %s:%s:%i %s " "got here", ms(), __FILE__, __func__, __LINE__,)
这是一个尾部逗号的错误。
我怎样才能改变我的 __VA_ARGS__
宏,使它能处理 "无变量""只有格式字符串 "的情况?
你可以分两步来做。
#define debug(...) DEBUG(__VA_ARGS__, "")
#define DEBUG(fmt, ...) printf("%lu %s:%s:%i " fmt "%s", ms(), __FILE__, __func__, __LINE__, __VA_ARGS__)
debug("%d\n", 42);
debug("Hello\n");
这样一来,即使你没有传递第二个param,它也会被替换成一个 ""
并导致NOP。
与其在宏中连接字符串,不如在宏中拆开 printf
分为两部分。一部分是统计资料,另一部分是调试信息。将它们与旧的 do { ... } while (0)
宏技巧。
#define debug(...) do { \
printf("%lu %s:%s:%i ", ms(), __FILE__, __func__, __LINE__); \
printf(__VA_ARGS__); \
} while (0)
那么你就不需要 fmt
作为单独的参数,可以只通过 __VA_ARGS__
到第二个 printf
.