(抱歉英语不好。)
我需要这样的宏MASK
:
MASK(a)
扩展到(1<<(a))
MASK(a,b)
扩展到(1<<(a) | 1<<(b))
MASK(a,b,c)
扩展到(1<<(a) | 1<<(b) | 1<<(c))
- 等等
是否可以在 C 预处理器中定义这样的宏?也许可以帮助一些 GCC 扩展?或者也许可以MASK(x)
使用单个参数来实现,例如MASK((a,b))
扩展为(1<<(a) | 1<<(b))
等。
添加。我对实现MASK
为函数不感兴趣。
(抱歉英语不好。)
我需要这样的宏MASK
:
MASK(a)
扩展到(1<<(a))
MASK(a,b)
扩展到(1<<(a) | 1<<(b))
MASK(a,b,c)
扩展到(1<<(a) | 1<<(b) | 1<<(c))
是否可以在 C 预处理器中定义这样的宏?也许可以帮助一些 GCC 扩展?或者也许可以MASK(x)
使用单个参数来实现,例如MASK((a,b))
扩展为(1<<(a) | 1<<(b))
等。
添加。我对实现MASK
为函数不感兴趣。
是的,假设一个几乎完全符合 C99 的预处理器,例如 GNU CPP(GCC/G++ 所使用的),这是可能的,无需任何扩展。
这里有一些使用出色的Order库的不同解决方案。您需要添加#include <order/interpreter.h>
才能使用它们。
只有一个#define
:
#define MASK(...) (ORDER_PP(8seq_for_each_with_delimiter( \
8fn(8N, 8print((1<<) 8tuple(8N))), \
8emit(8quote(|)), \
8tuple_to_seq(8quote((__VA_ARGS__))))))
对于编译器速度和可维护性:
#define GEN_MASK(x) 1<<(x)
#define ORDER_PP_DEF_8mask ORDER_PP_FN(8fn(8N, \
8emit(8quote(GEN_MASK),8tuple(8N))))
#define MASK(...) (ORDER_PP(\
8seq_for_each_with_delimiter(8mask, 8emit(8quote(|)), \
8tuple_to_seq(8quote((__VA_ARGS__))))))
对类似问题使用泛化:
#define MAP_DELIMITED(f,d, ...) ORDER_PP(\
8seq_for_each_with_delimiter(f, \
8emit(8quote(d)), \
8tuple_to_seq(8quote((__VA_ARGS__)))))
#define MASK(...) (MAP_DELIMITED( \
8fn(8N, 8print((1<<) 8tuple(8N))), \
|, \
__VA_ARGS__))
Order 实际上在预处理器中实现了一种高级函数式语言,允许使用比您想象的要复杂得多的宏。上述链接中的 repo 包含许多示例和文档的来源。