我想使用可变参数宏,但它似乎被设计为只专门处理第一个参数。我希望命名前两个参数,其余的不命名,如下所示:
#define FOO(AA,BB,...) AA->BB(AA,##...)
FOO(mystruct,funcname,123)
但是这不适用于 LLVM。我做错了什么,还是可变参数宏的工作方式有限制?
更新
正确答案是,使用##VA_ARGS 而不是##...
有一些网页声称“...”是有效的,但至少在 MacOS llvm 中它不是。
最佳答案
在宏扩展中,宏参数没有用 ...
扩展——它们怎么可能,因为这样你就不可能有一个在扩展中使用省略号的宏。相反,它将作为特殊参数 __VA_ARGS__
提供。
有了这个,下面的程序
#define FOO(AA,BB,...) AA->BB(AA, __VA_ARGS__)
FOO(mystruct,funcname,123)
FOO(mystruct,funcname,123,456)
##
是一个标记粘贴运算符。它将从 2 个部分中生成一个预处理 token 。 , ## ...
尝试生成预处理 token , ...
。它不是有效的 C token ,这就是 Clang 将报告的原因
<source>:3:1: error: pasting formed ',...', an invalid preprocessing token
关于具有两个命名参数的 C 可变参数宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53979508/