2013-12-12 45 views
0

SE处理计数传递给可变参数宏的实参的数量有几个问题和答案。这个问题似乎有一个规范的解决方案,其变体在答案中重复出现。引用可变参数宏中的特定参数

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

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

是有referrring到第二个参数列表(例如__VA_ARG_1__),假设我们知道,它实际上是通过一种方式?如果我们不知道它是否通过了会怎么样?

回答

3

你可以试试这个:

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

,如果你调用MACRO用过多的参数你会得到相应的错误信息。

+0

好的,请查看我对此问题的更新:“如果我们不知道它是否通过了,该怎么办?” - 有没有一种安全的方法来确定? – ysap

+0

@ysap:你得到一个编译器错误。我认为这很安全,因为它会阻止你将程序发送给你的客户。 –

+0

嗯,我的意思是运行时安全......也许“安全”不是这里最好的词。我希望能够确定是否在宏中使用ARGn之前。 AFAIR,你不能在宏内使用#ifdef,对吧? – ysap

0

为了得到一个任意参数,非常可怕的答案就在这里包含:

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

从函数式编程和程序设计语言理论我的(当然非专业)的理解,它做递归和模式匹配在预处理器中,如在Haskell,OCaml等中所做的那样,剥离N个元素,然后丢弃列表的后缀,留下结果。