如何理解C / C ++宏?

时间:2018-04-23 10:59:33

标签: c++ c macros

我有一个宏

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), ??? )

任何帮助都将不胜感激。

感谢。

1 个答案:

答案 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)将被视为未扩展的宏参数,并且在扩展之前没有关闭),预处理器将继续寻找结束)

相关问题