更改宏以删除不必要的尾部

时间:2015-08-23 14:45:06

标签: c boost macros c-preprocessor boost-preprocessor

我试图编写c89兼容的宏来将序列[(a)(b)(c)]翻译成逗号分隔的参数[a,b,c]。 c89表示没有 ARGV 和......

我现在的代码:

#define SEQSPLIT(seq)  SEQSPLIT_SEQ(SEQSPLIT_I1 seq)

#define SEQSPLIT_SEQ(x) SEQSPLIT_SEQ_I((x))
#define SEQSPLIT_SEQ_I(x) x
#define SEQSPLIT_I1(seq) seq, SEQSPLIT_I2
#define SEQSPLIT_I2(seq) seq, SEQSPLIT_I1

(1) (1) (1) (0) (1) (1) (1) (1)之类的输入,我收到(1, 1, 1, 0, 1, 1, 1, 1, SEQSPLIT_I1)。这几乎是我所需要的,除了最后一个逗号和#34; SEQSPLIT_I1"。

我怎样摆脱这个"尾巴"没有可变参数宏和提升? (在最好的情况下,我也想删除括号)。说到提升,他们为此提供了256行代码:

#define LOOOONGBOOSTMACRONAME_1(X) X, LOOOOOOONGBOOSTMACRONAME_0
#define LOOOONGBOOSTMACRONAME_2(X) X, LOOOOOOONGBOOSTMACRONAME_1
#define LOOOONGBOOSTMACRONAME_3(X) X, LOOOOOOONGBOOSTMACRONAME_2
...

之后他们把它全部用于变量宏。

当然我可以按现在的方式使用代码,最后一个宏可以通过具体的包装器过滤,如

#define WRAPPER_8(P7, P6, P5, P4, P3, P2, P1, P0, TAIL) \
                  P7, P6, P5, P4, P3, P2, P1, P0

但这意味着最终用户自己编写包装器。我根本不想在输出中留下尾部(想想就像用c89兼容性和完整的32位算术替换boost一样),因为那条尾巴也意味着包装写给我,因为我可以&#39 ; t直接在其他期望8个参数的函数中使用此宏。

0 个答案:

没有答案