Да, это возможно, без любых расширений, принимая почти полностью C99 совместимый препроцессор, таких как ГНУ CPP (как используется GCC/G ++).
Here are a few different solutions using the brilliant Order library. You will need to add #include
to use them.
Со всего один #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__))
Заказ на самом деле осуществляет функциональный язык высокого уровня в препроцессоре, позволяя намного более сложный макрос, чем вы думали бы возможные. repo в вышеупомянутой связи включает много примеров и источник к документации.