#define INITIALIZE_INT_ARRAY(elem_type, array_name,...) \
elem_type array_name[] = { __VA_ARGS__ }; \
INITIALIZE_INT_ARRAY(int, arr, 1, 2, 3, 4, 5)
// will expand to
int arr[] = {1, 2, 3, 4. 5};现在,我希望在__VA_ARGS__中支持元组,如果元组是元组,则只获取元组的第一个元素。
INITIALIZE_INT_ARRAY(int, arr, 1, (2, hello), (3, world), (4, X), 5)
// will still expand to
int arr[] = {1, 2, 3, 4, 5}如何更改我的INITIALIZE_INT_ARRAY
发布于 2020-08-26 06:00:32
通常,在预处理器中迭代逗号分隔的列表需要编写O(n)样板宏。你可以自己写或者从Boost.Preprocessor获取它们,或者...
您可以对列表使用不同的语法:FOO(int, arr, (1)(2, hello)(3, world)(4, X)(5))。
然后,宏可以像这样编写,没有样板:
#define FOO(type_, name_, seq_) \
type_ name_[] = { FOO_END( FOO_LOOP_A seq_ ) }; \
#define FOO_END(...) FOO_END_(__VA_ARGS__)
#define FOO_END_(...) __VA_ARGS__##_END
#define FOO_LOOP_A(...) FOO_LOOP_BODY(__VA_ARGS__,) FOO_LOOP_B
#define FOO_LOOP_B(...) FOO_LOOP_BODY(__VA_ARGS__,) FOO_LOOP_A
#define FOO_LOOP_A_END
#define FOO_LOOP_B_END
#define FOO_LOOP_BODY(x, ...) x,https://stackoverflow.com/questions/63587590
复制相似问题