11

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

#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);

但是有什么办法可以让这看起来不那么难看吗?谢谢!

4

1 回答 1

14

我看到了这个问题的两种解决方案。(如果算上“坚持使用 gcc”,则为三个)。

额外特例宏

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

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

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

放入fmt'...'

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

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

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

于 2010-08-30T08:00:30.060 回答