具有两个命名参数的 C 可变参数宏

标签 c c-preprocessor

我想使用可变参数宏,但它似乎被设计为只专门处理第一个参数。我希望命名前两个参数,其余的不命名,如下所示:

#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)

will be preprocessed to


## 是一个标记粘贴运算符。它将从 2 个部分中生成一个预处理 token 。 , ## ... 尝试生成预处理 token , ...。它不是有效的 C token ,这就是 Clang 将报告的原因

<source>:3:1: error: pasting formed ',...', an invalid preprocessing token 

关于具有两个命名参数的 C 可变参数宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53979508/

相关文章:

c - 如何跟踪c宏扩展?

c - GCC -D 相当于 iarbuild.exe

c - 如何用 gcc 捕获未定义的预处理器宏?

c++ - 在 C++ 中定义二进制宏

c - 父子和 fork 子之间的文件描述符共享

c++ - 为什么pthread_cond_signal会导致死锁

你能用 C#define 注释吗?

c - 如何在 C 中将一个字符串分成多个其他特定长度的字符串?

c - 消息队列中的多条消息

c - 解释 gdb 输出