我刚学会了X-Macros.您看过X-Macros的实际用途?他们什么时候成为工作的合适工具?
我遇到了一些理论问题.在一段代码中,我维护着一组宏
#define MAX_OF_2(a, b) (a) > (b) ? (a) : (b)
#define MAX_OF_3(a, b, c) MAX_OF_2(MAX_OF_2(a, b), c)
#define MAX_OF_4(a, b, c, d) MAX_OF_2(MAX_OF_3(a, b, c), d)
...etc up to MAX_OF_8
Run Code Online (Sandbox Code Playgroud)
我想做的是用这样的东西替换它们:
/* Base case #1, single input */
#define MAX_OF_N(x) (x)
/* Base case #2, two inputs */
#define MAX_OF_N(x, y) (x) > (y) ? (x) : (y)
/* Recursive definition, arbitrary number of inputs */
#define MAX_OF_N(x, ...) MAX_OF_N(x, MAX_OF_N(__VA_ARGS__))
Run Code Online (Sandbox Code Playgroud)
...当然,这是无效的预处理器代码.
忽略这个特殊情况应该使用函数而不是预处理器宏来解决,是否可以定义一个可变的MAX_OF_N()宏?
为了清楚起见,最终结果应该是一个宏,它接受任意数量的参数并评估其中最大的参数.我有一种奇怪的感觉,这应该是可能的,但我没有看到如何.
我创建了一个小宏元编程库,实现基本的构建体,例如REPEAT(times, x),IF(value, true, false)元组,等等.
我的大多数实现都是通过基于可变参数计数或通过计数器重载宏来实现的:
// Example:
#define REPEAT_0(x)
#define REPEAT_1(x) x REPEAT_0(x)
#define REPEAT_2(x) x REPEAT_1(x)
#define REPEAT_3(x) x REPEAT_2(x)
// ...
// (these defines are generated using an external script)
// ...
#define REPEAT(count, x) CAT(REPEAT_, count)(x)
Run Code Online (Sandbox Code Playgroud)
这很好,但我最近遇到了Paul Fultz的一个非常有趣的宏递归实现.
直到延迟表达部分,我没有理解他的文章.
但是,我在理解使用DEFER和OBSTRUCT正确使用方面遇到了很多麻烦.
Paul实现了一个非常优雅的版本,REPEAT不需要脚本生成的定义,如下所示:
#define EAT(...)
#define EXPAND(...) __VA_ARGS__
#define WHEN(c) IF(c)(EXPAND, EAT)
#define REPEAT(count, macro, ...) \
WHEN(count) \
( \ …Run Code Online (Sandbox Code Playgroud)