c++ - ##__VA_ARGS__ 是什么意思?
问题描述
我想知道##
这个宏定义有什么作用:
#define debug(M, ...) fprintf(stderr,M "\n",##__VA_ARGS __)
我用谷歌搜索了一个答案,我想出了以下内容。
##
如果没有为宏提供变量参数,则将删除逗号。因此,如果像这样调用宏
debug("message");
没有引号,它被扩展为
fprintf(stderr,"message");
不是
fprintf(stderr,"message",);
为什么要去掉逗号?
解决方案
这是 gcc 引入的一种不可移植的语法,专门用于处理根本不传递参数的这种极端情况。如果没有##,它会抱怨尾随逗号是语法错误。
https://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html
__VA_OPT__
为此目的
引入了 C++20 : https ://en.cppreference.com/w/cpp/preprocessor/replace
推荐阅读
- git - 如何在 TortoiseGit 中填写默认提交消息?
- mysql - 汇合的 JDBC-Sink Examples.table 不存在
- django - 抛出异常时 Gunicorn 工作人员重新启动
- c++ - qt图表等轴(轴应该是正方形而不是矩形)
- ubuntu-14.04 - gstreamer 配置错误 Ubuntu
- c# - 在实体框架中以列表形式返回选定列时出现问题
- laravel - 无法在本地使用 Laravel 重置密码
- android - 程序类型已经存在:com.loopj.android.http.AsyncHttpClient$3
- qt - 带有将焦点转移到其父级的 MouseArea 的 Qml 窗口
- solr - SOLR ,将函数应用于查询中的参数