【问题标题】:Variadic Macro Expansion: Expected primary expression before ) when __VA_ARGS__ is used可变参数宏扩展:使用 __VA_ARGS__ 时的预期主表达式
【发布时间】:2021-05-23 07:03:49
【问题描述】:

我有以下代码:

#define TRACE_NONE 0
#define TRACE_ERROR 1
#define TRACE_WARNING 2
#define TRACE_INFORMATIONAL 3
#define TRACE_DEBUG 4
#define TINFO(str,cat,...) trace(TRACE_INFORMATIONAL,str,cat,__VA_ARGS__)
#define TWARN(str,cat,...) trace(TRACE_WARNING,str,cat,__VA_ARGS__)
#define TERROR(str,cat,...) trace(TRACE_ERROR,str,cat,__VA_ARGS__)
#define TDEBUG(str,cat,...) trace(TRACE_DEBUG,str,cat,__VA_ARGS__)

在我得到的#define TINFO 行 错误:')' 标记之前的预期主表达式

当我这样使用它时

TINFO("Session start","SES");

编辑:但是如果我提供第三个参数,例如 TINFO("Session start","SES","");

一切正常。

我希望第一个变体起作用

我的跟踪函数签名是这样的:

void trace(int level,const char* sz,const char* cat,...);

如果重要的话

我并没有真正使用__VA_ARGS__ - 我最后一次使用它是在几年前,在查看了几个示例之后,我似乎无法在这里找到我做错了什么。我错过了一些简单的东西 - 我知道我是 - 但我不知道这对我的生活来说是什么。

此代码可以是 GCC 特定的。

【问题讨论】:

    标签: c parameter-passing variadic-functions preprocessor


    【解决方案1】:

    经过一些实验,我发现我需要使用##

    #define TINFO(str,cat,...) trace(TRACE_INFORMATIONAL,str,cat, ##__VA_ARGS__ )
    #define TWARN(str,cat,...) trace(TRACE_WARNING,str,cat, ##__VA_ARGS__  )
    #define TERROR(str,cat,...) trace(TRACE_ERROR,str,cat, ##__VA_ARGS__ )
    #define TDEBUG(str,cat,...) trace(TRACE_DEBUG,str,cat, ##__VA_ARGS__ )
    

    那行得通。我试过 VA_OPT 但它不起作用,因为显然我的工具链使用了旧的编译器(我正在为微控制器交叉编译,但我还不习惯工具链)

    【讨论】:

    • 请注意,##__VA_ARGS__ 是一个仅适用于 GNU 的 GCC 扩展。即使您最终使用 -std=c++17 或类似的,它也将不再起作用。只是一个抬头。我真的很赞同他们会让##__VA_ARGS__ 成为标准。
    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 2012-02-29
    • 2015-12-02
    相关资源
    最近更新 更多