可以将逗号和参数传递给 C++ 宏吗?
Posted
技术标签:
【中文标题】可以将逗号和参数传递给 C++ 宏吗?【英文标题】:Possible to pass comma and args into C++ macro? 【发布时间】:2018-05-19 15:52:37 【问题描述】:想知道是否可以为 C++ 宏分配两个用逗号分隔的值,然后使用该宏定义传递给宏的两个参数?
例如,对于宏
#define ADD_TWO(first, second) first + second
这行得通:
int foo = ADD_TWO(0, 42);
但这不是
#define ZERO_COMMA_FORTY_TWO 0,42
int bar = ADD_TWO(ZERO_COMMA_FORTY_TWO);
有没有办法将一个宏定义为另一个宏的两个或多个参数?
编辑:环境是 VS2017
【问题讨论】:
避免宏编程。 @Ron 你将从我冰冷的死手手中接过宏元编程! @Quentin Lol,我会支持你的评论。 宏很有趣:ADD_TWO(3.14159, true)
和 ADD_TWO("Macro", 3.14159)
。改用函数(或内联函数)。
@ThomasMatthews 我非常怀疑他的实际用例是否添加了两个值——可能只是一个有趣的 MCVE
【参考方案1】:
您不能直接执行此操作。具有两个参数的宏需要传递两个参数,ZERO_COMMA_FORTY_TWO
被视为一个参数。但是,您可以添加一个额外的间接层来扩展通过可变参数宏传入的宏:
#define ADD_TWO_IMPL(first, second) first + second
#define ADD_TWO(...) ADD_TWO_IMPL(__VA_ARGS__)
#define ZERO_COMMA_FORTY_TWO 0, 42
然后,这两个都可以工作
int foo = ADD_TWO(0, 42);
int bar = ADD_TWO(ZERO_COMMA_FORTY_TWO);
显然,MSVC 有 a bug 导致它拒绝此代码,但我们可以解决这个问题(使用更多间接性):
#define ADD_TWO_IMPL(first, second) first + second
#define UNPACK(macro, args) macro args
#define ADD_TWO(...) UNPACK(ADD_TWO_IMPL, (__VA_ARGS__))
此版本在 MSVC、GCC 和 Clang 上编译
【讨论】:
@buttonsrtoys 调整了解决方法以适用于您的特定用例以上是关于可以将逗号和参数传递给 C++ 宏吗?的主要内容,如果未能解决你的问题,请参考以下文章