2012-10-30 52 views
0

假設N將小於或等於參數個數,我如何從VA_ARGS中提取[0 ... N]參數。C預處理器:從__VA_ARGS__提取[0 ... N]參數

實施例:

#define MY_SEQ r0, r1, r2, r3, r4, r5, r6, r7, \ 
       r8, r9, r10, r11, r12, r13, r14, r15 

#define EXTRACT_N(n, SEQ) {... magic ...} 

... 

EXTRACT_N(5, (MY_SEQ())); 

should expand to: 

{r0, r1, r2, r3, r4}; 

它的確定假設序列元件是這種形式WHATEVER ## N,其中N是第N個元素的。

我正在尋找一些不錯的解決方案來解決這個問題而不是使用BOOST,例如我想了解它是如何做到的。

我使用迭代方法做了它,但我想知道是否有其他方法可以做到這一點。 下面是我如何實現它:

#define EXTRACT_1(t0)    t0 
#define EXTRACT_2(t0, t1)   EXTRACT_1(t0),t1 
#define EXTRACT_3(t0, t1, t2)  EXTRACT_2(t0, t1),t2 
#define EXTRACT_4(t0, t1, t2, t3) EXTRACT_3(t0, t1, t2),t3 
... 

回答

2

在一般情況下你不能那樣做。 c預處理器不夠靈活。

你可能有這樣的事情

#define EXTRACT_N(N,A) EXTRACTTHEM ## N(A) 

,並有

#define EXTRACTTHEM1(X, ...) X 
#define EXTRACTTHEM2(X,Y, ...) X,Y 

(很容易產生隨意性較大,但有界,設置成宏)。

存在比cpp更強大的處理器,例如, m4gpp

你可能會考慮,而不是生成C或C++代碼(使用您自己的腳本,或者一些發電機),並讓您的樓宇系統(例如Makefile)採取從不同的東西生成C代碼的照顧。

+0

那麼,你自相矛盾說,這是不可能的,他們展示了一個工作的例子。這就是我在代碼中完成的方式,但是我很好奇是否有更好的解決方案(可能帶有boost預處理器)。我完全不關心c-preprocessor之外的任何其他東西,因爲這個代碼是真正的c/C++項目的一部分。 – Pavel

+0

我編輯了顯示我正在尋求避免的迭代方法的問題。 – Pavel

+0

我覺得你有一個很好的例子在其他地方生成C++代碼(可能用'gpp',看起來像'cpp'友好) –