我在下面为调试打印定义了两个可变参数宏。
#define MYTRACE(fmt, args...) printf("%s(): "fmt"\n", __func__, ##args)
#define MYTRACE_ERR(err, fmt, args...) printf("[ERR] %s(): "fmt" err=%d\n", __func__, ##args, err)
其次是不仅显示消息而且显示给第一个参数的错误代码的人。 使用它们,我写了下面的代码。
int main(void) {
int err = 0;
MYTRACE("this is test, err=%d.", err);
MYTRACE();
MYTRACE_ERR(err, "error!");
MYTRACE_ERR(err); // This becomes error.
MYTRACE_ERR(err, ""); // This is OK.
}
此代码无法编译,因为MYTRACE_ERR(err);
变为宏使用错误,但MYTRACE();
不是。
为避免错误,MYTRACE_ERR
似乎至少需要两个参数。
即使没有给出任何参数,我也不明白为什么MYTRACE
有效,但如果没有给出两个参数,则MYTRACE_ERR
不起作用。
答案 0 :(得分:2)
根据:https://gcc.gnu.org/onlinedocs/cpp/Macro-Arguments.html
你可以将宏参数留空;这不是一个错误 预处理器(但许多宏将扩展为无效代码)。您 不能完全抛弃争论;如果一个宏有两个参数, 在参数列表的顶层必须只有一个逗号。
使用MYTRACE_ERR(err,);
将编译!
此外,定义可变参数宏的正确方法应如下:
#define MYTRACE(fmt, ...) printf("%s(): "fmt"\n", __func__, ##__VA_ARGS__)