首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++预处理中处理__VA_ARGS__?

如何在C++预处理中处理__VA_ARGS__?
EN

Stack Overflow用户
提问于 2020-08-26 05:49:33
回答 1查看 57关注 0票数 1
代码语言:javascript
复制
#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__中支持元组,如果元组是元组,则只获取元组的第一个元素。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2020-08-26 06:00:32

通常,在预处理器中迭代逗号分隔的列表需要编写O(n)样板宏。你可以自己写或者从Boost.Preprocessor获取它们,或者...

您可以对列表使用不同的语法:FOO(int, arr, (1)(2, hello)(3, world)(4, X)(5))

然后,宏可以像这样编写,没有样板:

代码语言:javascript
复制
#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,
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63587590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档