3

Nが引数の数以下であると仮定して、 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
...
4

1 に答える 1

3

一般的なケースではそれを行うことはできません。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コードの生成を処理させることを検討してください。

于 2012-10-30T16:47:35.027 に答える