C-preprocessor:从__VA_ARGS__中提取[0 ... N] args

时间:2012-10-30 16:43:12

标签: c-preprocessor

如何从 VA_ARGS 中提取[0 ... N]个参数,假设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
...

1 个答案:

答案 0 :(得分: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代码。