首页 > 解决方案 > 可变参数宏扩展:使用 __VA_ARGS__ 时的预期主表达式

问题描述

我有以下代码:

#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 特定的。

标签: cparameter-passingvariadic-functionspreprocessor

解决方案


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

#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 但它不起作用,因为显然我的工具链使用了旧的编译器(我正在为微控制器交叉编译,但我还不习惯工具链)


推荐阅读