C变量宏

时间:2015-11-22 08:45:26

标签: c gcc c-preprocessor variadic-macros

我在下面为调试打印定义了两个可变参数宏。

#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不起作用。

1 个答案:

答案 0 :(得分:2)

根据:https://gcc.gnu.org/onlinedocs/cpp/Macro-Arguments.html

  

你可以将宏参数留空;这不是一个错误   预处理器(但许多宏将扩展为无效代码)。您   不能完全抛弃争论;如果一个宏有两个参数,   在参数列表的顶层必须只有一个逗号。

使用MYTRACE_ERR(err,);将编译!

此外,定义可变参数宏的正确方法应如下:

#define MYTRACE(fmt, ...) printf("%s(): "fmt"\n", __func__, ##__VA_ARGS__)