## __ VA_ARGS__是什么意思?

时间:2018-10-19 11:32:59

标签: c++ macros preprocessor variadic-macros

我想知道##在此宏定义中的作用:

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

我用Google搜索了一个答案,然后提出了以下建议。

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

debug("message");

没有引号,它会扩展为

fprintf(stderr,"message");

不是

fprintf(stderr,"message",);

为什么要删除逗号?

1 个答案:

答案 0 :(得分:0)

显然,这是gcc引入的一种非便携式语法,专门用于处理根本不传递任何参数的这种极端情况。 如果没有##,它会抱怨结尾逗号是语法错误。

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

https://en.cppreference.com/w/cpp/preprocessor/replace