我正在研究一个宏,或者更有可能是宏的组合,它将实现以下效果:
BRACKET(a) => { a }
BRACKET(a, b) => { a }, { b }
BRACKET(a, b, c) => { a }, { b }, { c }听起来很简单?唉,我找不到任何合理的解决办法。可能有重量级的论点,基于对论点的nb数,然后为每一个可能的论点创建一个专用的宏,这对手头的问题感到严重的过度(而对于可怜的后继者来说很难维持)。但到目前为止我还没有找到更简单的解决方案。
编辑:当前的解决方案,我们正在努力改进:使用一个宏的每个列表大小。
BRACKET1(a) => { a }
BRACKET2(a, b) => { a }, { b }
BRACKET3(a, b, c) => { a }, { b }, { c }
etc.发布于 2022-05-10 10:43:00
变量宏很少容易用于通用编程目的。有一些相当复杂的方法,你可以把它们扩展到一个固定的最大值,但它可能会更好地寻找替代解决方案。特别是在你冒着风险发明一些特定于项目的宏语言的时候。
其中一种替代解决方案是强制调用方处理特定的变量数据集,而不是向某些类似于功能的宏的可变输入。
例如,如果调用方可以通过“X宏”定义任意长度和内容的数据集:
#define DATA(X) X(1) X(2) X(3) X(4) X(5)然后,我们可以将各种特定行为应用于该数据集,例如:
#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"
或者你喜欢的任何东西。
https://stackoverflow.com/questions/71880026
复制相似问题