C99中带有0个参数的变量宏

时间:2010-08-26 14:57:33

标签: macros c99 variadic

我有一些调试代码如下所示:

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
void __my_error(const char*loc, const char *fmt, ...);
#define my_error(fmt, ...) __my_error(AT, fmt, ##__VA_ARGS__)

使用了最后一个宏,因此我可以将位置插入到调试输出中,以确定错误发生的位置。但是,当我这样调用函数时:

my_error("Uh oh!");

喜欢我的代码是C99,所以我发现当这个编译时,我得到以下错误:

error: ISO C99 requires rest arguments to be used

我知道我可以通过更改对

的调用来解决这个问题
my_error("Uh oh!", NULL);

但有什么方法可以让这个看起来不那么难看?谢谢!

1 个答案:

答案 0 :(得分:12)

我看到了这个问题的两个解决方案。 (三,如果算上'坚持用gcc')。

特殊情况宏

为您想要打印固定字符串时添加新宏。

#define my_errorf(str) my_error(str, NULL)

Pro :最少额外代码。
Con:使用错误的宏很容易(但至少在编译时会注意到这一点)。

fmt放在'...'

Vararg宏只能有__VA_ARGS__作为参数(与vararg函数不同)。因此,您可以将fmt参数放在__VA_ARGS__中并更改您的函数。

void __my_error(const char *loc, ...);
#define my_error(...) __my_error(AT, __VA_ARGS__)

Pro :所有错误消息的一种语法/宏 Con :需要重写__my_error函数,这可能是不可能的。