如何制作一个__VA_ARGS__宏,可以在没有参数的情况下调用?[重复]

问题描述 投票:0回答:1

我有一个宏。

#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__ 宏,使它能处理 "无变量""只有格式字符串 "的情况?

c variadic-functions
1个回答
2
投票

你可以分两步来做。

#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。


0
投票

与其在宏中连接字符串,不如在宏中拆开 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.

© www.soinside.com 2019 - 2024. All rights reserved.