如何使用C / C ++宏?

教s

我有一个宏

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

任何帮助,将不胜感激。

谢谢。

用户名

您可以通过以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)将被当作未扩展的宏参数使用,并且由于)在扩展之前没有关闭,因此预处理器将继续寻找close )

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章