Gcc 参数数未定义的掩码(…)宏(C)
对不起,英语不好 我需要宏掩码,以便:Gcc 参数数未定义的掩码(…)宏(C),gcc,c-preprocessor,Gcc,C Preprocessor,对不起,英语不好 我需要宏掩码,以便: MASKa扩展到1是的,假设有一个几乎完全兼容C99的预处理器,例如GCC/G++使用的GNU CPP,那么在没有任何扩展的情况下,这是可能的 下面是一些使用brilliant库的不同解决方案。您需要添加include才能使用它们 只有一个定义: 对于编译器速度和可维护性: #define GEN_MASK(x) 1<<(x) #define ORDER_PP_DEF_8mask ORDER_PP_FN(8fn(8N, \ 8emit(
MASKa扩展到1是的,假设有一个几乎完全兼容C99的预处理器,例如GCC/G++使用的GNU CPP,那么在没有任何扩展的情况下,这是可能的 下面是一些使用brilliant库的不同解决方案。您需要添加include才能使用它们 只有一个定义: 对于编译器速度和可维护性:
#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包含许多示例和文档的来源。您是否要求宏以这种方式展开,换句话说,它生成一个常量,或者如果展开为函数调用是否可以?后者可以用C99可变宏来实现。@Chris:我知道我可以用….实现掩码作为内联函数。。。。此外,我认为像GCC这样的好编译器会优化调用,因为它将被明确地编写1
#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__))