我有一个宏
DECLARE_SOMETHING(X, Y) {X, Y}
由于宏回调,我想分两步调用
CURRIED_DECLARE_SOMETHING(X)(Y)
但我怎么能这样做?我真的不介意DECLARE_SOMETHING
是否确实存在,我只想写一些像{X, Y}
那样简单的声明,但称之为咖喱。
我试过这样的东西,但我不知道如何用给定给Y的值替换???
。
#define CURRY(BODY, Y) BODY(Y)
#define CURRIED_DECLARE_SOMETHING(X) CURRY( DECLARE_SOMETHING(X, Y), ??? )
任何帮助都将不胜感激。
感谢。
答案 0 :(得分:5)
您可以通过使用另一个宏的名称结束CURRIED_DECLARE_SOMETHING
的定义来接近,然后由(Y)
调用
#define DECLARE_SOMETHING(X, Y) {X, Y}
#define LPAREN (
#define RPAREN )
#define EXPAND(x) x
#define CURRIED_DECLARE_SOMETHING(X) DECLARE_SOMETHING LPAREN X, CURRIED_DECLARE_SOMETHING_2
#define CURRIED_DECLARE_SOMETHING_2(Y) Y RPAREN
现在,EXPAND(CURRIED_DECLARE_SOMETHING(X)(Y))
扩展为{X, Y}
。
您可以对此进行扩展以根据需要添加任意数量的参数:
#define CURRIED_DECLARE_SOMETHING(X) DECLARE_SOMETHING LPAREN X, CURRIED_DECLARE_SOMETHING_2
#define CURRIED_DECLARE_SOMETHING_2(Y) Y, CURRIED_DECLARE_SOMETHING_3
#define CURRIED_DECLARE_SOMETHING_3(Z) Z RPAREN
虽然我没有看到避免额外EXPAND
的简单方法。您不能只编写DECLARE_SOMETHING(x, CURRIED_DECLARE_SOMETHING_2
,因为这样,完整的CURRIED_DECLARE_SOMETHING_2(Y)
将被视为未扩展的宏参数,并且在扩展之前没有关闭)
,预处理器将继续寻找结束)
。