引用可变参数宏中的特定参数

时间:2013-12-12 21:52:30

标签: c macros arguments c99 argument-passing

SE上有几个问题和答案,涉及计算传递给可变参数宏的实际参数的数量。这个问题似乎有一个规范的解决方案,其答案在答案中重复。

我的问题是,是否可以引用列表中的特定参数(以安全的方式)?例如,如果宏定义为:

#define MACRO(...) { some code involving __VA_ARGS__ }

有没有办法引用列表中的第二个参数(例如__VA_ARG_1__),假设我们知道它实际上已经通过了?如果我们不知道它是否通过怎么办?

2 个答案:

答案 0 :(得分:3)

你可以试试这个:

#define GET_SECOND(x, y, ...) (y)
#define MACRO(...) { some_code_using(GET_SECOND(__VA_ARGS__)); }

如果您使用少量参数调用MACRO,则会收到合适的错误消息。

答案 1 :(得分:0)

为了得到一个任意的论点,这里包含了非常可怕的答案:

http://p99.gforge.inria.fr/p99-html/p99__list_8h.html

从我对功能编程和编程语言理论的理解,它在预处理器中进行递归和模式匹配,就像在Haskell,OCaml等中一样,剥离N个元素,然后丢弃列表的后缀,留下结果。