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__))