我有一些调试代码如下所示:
#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);
但有什么方法可以让这个看起来不那么难看?谢谢!
答案 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
函数,这可能是不可能的。