c - 可变参数宏扩展:使用 __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 特定的。
解决方案
经过一些实验,我发现我需要使用##
#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 但它不起作用,因为显然我的工具链使用了旧的编译器(我正在为微控制器交叉编译,但我还不习惯工具链)
推荐阅读
- java - Java mac sha256散列与使用pack的php hmac sha256不匹配?
- javascript - 如何将 input_tag 的值存储在变量中?
- c# - 从列表中删除重复值
- java - 如何获取同一页面的当前网址?
- android - 将 NFC 卡点击并转到手机
- php - 将自定义字段添加到附加图像(重命名为规范)选项卡,无插件
- excel - 在多个图表(包括隐藏图表)上更改 X 轴最大值和最小值
- javascript - 我无法在 firebase 中使用 signInWithEmailAndPassword(email,password) 登录
- powershell - 当该函数没有 WhatIf 参数时,抑制被调用函数/cmdlet 的 WhatIf 输出
- javascript - 谁能弄清楚为什么我的 div 上的 addEventListener 不起作用?