我有一个宏
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] 删除。
我来说两句