我有一个宏
DECLARE_SOMETHING(X, Y) {X, Y}
Run Code Online (Sandbox Code Playgroud)
由于宏回调,我想分两步调用
CURRIED_DECLARE_SOMETHING(X)(Y)
Run Code Online (Sandbox Code Playgroud)
但是我该怎么做呢?我真的不介意是否DECLARE_SOMETHING真的存在,我只是想写一些简单{X, Y}的声明,但称之为咖喱.
我尝试过这样的东西,但我不知道如何???用赋予Y的值替换它.
#define CURRY(BODY, Y) BODY(Y)
#define CURRIED_DECLARE_SOMETHING(X) CURRY( DECLARE_SOMETHING(X, Y), ??? )
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.
谢谢.
小智 7
您可以通过结束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
Run Code Online (Sandbox Code Playgroud)
现在,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
Run Code Online (Sandbox Code Playgroud)
我没有看到一种避免额外的简单方法EXPAND.你不能只写DECLARE_SOMETHING(x, CURRIED_DECLARE_SOMETHING_2,因为这样,完整CURRIED_DECLARE_SOMETHING_2(Y)将被视为未展开的宏参数,并且由于)在扩展之前没有关闭,预处理器将继续寻找结束).