具有未定义参数数量的MASK(...)宏(在C中)

时间:2013-01-09 14:38:07

标签: gcc c-preprocessor

(抱歉英语不好。)

我需要宏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不感兴趣。

1 个答案:

答案 0 :(得分:0)

是的,可以在没有任何扩展的情况下假设一个接近完全符合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包含许多示例和文档的来源。