SE上有几个问题和答案,涉及计算传递给可变参数宏的实际参数的数量。这个问题似乎有一个规范的解决方案,其答案在答案中重复。
我的问题是,是否可以引用列表中的特定参数(以安全的方式)?例如,如果宏定义为:
#define MACRO(...) { some code involving __VA_ARGS__ }
有没有办法引用列表中的第二个参数(例如__VA_ARG_1__
),假设我们知道它实际上已经通过了?如果我们不知道它是否通过怎么办?
答案 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个元素,然后丢弃列表的后缀,留下结果。