首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C11变量宏:将元素放入括号中

C11变量宏:将元素放入括号中
EN

Stack Overflow用户
提问于 2022-04-15 04:17:00
回答 1查看 48关注 0票数 0

我正在研究一个宏,或者更有可能是宏的组合,它将实现以下效果:

代码语言:javascript
复制
BRACKET(a)    =>  { a }
BRACKET(a, b) =>  { a }, { b }
BRACKET(a, b, c) => { a }, { b }, { c }

听起来很简单?唉,我找不到任何合理的解决办法。可能有重量级的论点,基于对论点的nb数,然后为每一个可能的论点创建一个专用的宏,这对手头的问题感到严重的过度(而对于可怜的后继者来说很难维持)。但到目前为止我还没有找到更简单的解决方案。

编辑:当前的解决方案,我们正在努力改进:使用一个宏的每个列表大小。

代码语言:javascript
复制
BRACKET1(a)    =>  { a }
BRACKET2(a, b) =>  { a }, { b }
BRACKET3(a, b, c) => { a }, { b }, { c }
etc.
EN

回答 1

Stack Overflow用户

发布于 2022-05-10 10:43:00

变量宏很少容易用于通用编程目的。有一些相当复杂的方法,你可以把它们扩展到一个固定的最大值,但它可能会更好地寻找替代解决方案。特别是在你冒着风险发明一些特定于项目的宏语言的时候。

其中一种替代解决方案是强制调用方处理特定的变量数据集,而不是向某些类似于功能的宏的可变输入。

例如,如果调用方可以通过“X宏”定义任意长度和内容的数据集:

代码语言:javascript
复制
#define DATA(X) X(1) X(2) X(3) X(4) X(5)

然后,我们可以将各种特定行为应用于该数据集,例如:

代码语言:javascript
复制
#define BRACKET(x) {x},
...
DATA(BRACKET);

这将扩展到{1},{2},{3},{4},{5},

使用此方法,您可以创建各种类似的宏:

#define COMMAS(x) x, -> 1,2,3,4,5,

#define STR_LITERAL(x) #x -> "1" "2" "3" "4" "5" -> "12345"

或者你喜欢的任何东西。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71880026

复制
相关文章

相似问题

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