2013-12-12 46 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個元素,然後丟棄列表的後綴,留下結果。