【发布时间】:2011-04-04 08:00:27
【问题描述】:
我有一些调试代码,如下所示:
#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);
但是有什么办法可以让这看起来不那么难看?谢谢!
【问题讨论】:
-
您可能还想看看这个答案:stackoverflow.com/questions/1644868/…(单参数部分)
-
在定义自己的名称时要小心,其中包含两个相邻的下划线:所有这些名称都由标准保留(因此库、编译器或标准更新可能会以某种方式使用它们)。