我试图编写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个参数的函数中使用此宏。