如何咖喱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)
将被视为宏参数,并且由于扩展之前没有关闭的)
,因此预处理程序将继续寻找)
。
相关文章:
- 函数何时会在c++中包含stack_Unwind_Resume调用
- Python中的for循环与C++有何不同
- 在C++中释放内存期间,迭代器与指针有何不同
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 类中的 C++ int 被设置为值,似乎不知从何而来
- -fvisibility-inline-hidden 与 gcc 中的 -fvisibility=hidden 有何不同
- 收益率和回报有何不同?
- 覆盖私有功能,它与受保护功能有何不同?
- 擦除删除成语的性能增益从何而来
- 无论代码长度如何,以下代码的内存要求有何不同?
- "virtual"对C++析构函数有何影响?
- 如果我对"while"块发表评论,为什么程序会死机?其中的"yield"线有何影响?
- 系统时间从何而来?
- stl::unordered_map 和 stl::vector 的销毁有何不同
- C++ 友元函数在内存位置上有何不同?
- 如何咖喱C/C 宏
- 为什么我可以在不链接任何额外库的情况下包含 sys/*.h
- C 是否具有接口类概念,如果它在那里,那么它与Java接口类别有何不同
- std::u8string与std::string有何不同?
- 功能和变量从何而来