如何从 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
...
答案 0 :(得分:2)
在一般情况下,你不能这样做。 c预处理器不那么灵活。
你可能有像
这样的东西#define EXTRACT_N(N,A) EXTRACTTHEM ## N(A)
并且
#define EXTRACTTHEM1(X, ...) X
#define EXTRACTTHEM2(X,Y, ...) X,Y
等
(很容易生成任意大的但有界的一组这样的宏)。
有比cpp
更强大的处理器,例如m4
或gpp
您可以考虑生成C或C ++代码(使用自己的脚本或某些生成器),并让您的构建系统(例如Makefile
)负责从不同的代码生成C代码。