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

ETC

(很容易生成任意大但有界的此类宏集)。

cpp有比例如m4gpp更强大的处理器

您可能会考虑生成您的 C 或 C++ 代码(使用您自己的脚本或一些生成器)并让您的构建系统(例如Makefile)负责从不同的东西生成 C 代码。

于 2012-10-30T16:47:35.027 回答