如何咖喱C/C 宏

How to curry a C/C++ macro?

本文关键字:何咖喱      更新时间:2023-10-16

我有一个宏

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)将被视为宏参数,并且由于扩展之前没有关闭的),因此预处理程序将继续寻找)