首页 > 解决方案 > ##__VA_ARGS__ 是什么意思?

问题描述

我想知道##这个宏定义有什么作用:

#define debug(M, ...) fprintf(stderr,M "\n",##__VA_ARGS __)

我用谷歌搜索了一个答案,我想出了以下内容。

##如果没有为宏提供变量参数,则将删除逗号。因此,如果像这样调用宏

debug("message");

没有引号,它被扩展为

fprintf(stderr,"message");

不是

fprintf(stderr,"message",);

为什么要去掉逗号?

标签: c++macrospreprocessorvariadic-macros

解决方案


这是 gcc 引入的一种不可移植的语法,专门用于处理根本不传递参数的这种极端情况。如果没有##,它会抱怨尾随逗号是语法错误。

https://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html

__VA_OPT__为此目的 引入了 C++20 : https ://en.cppreference.com/w/cpp/preprocessor/replace


推荐阅读