可以将逗号和参数传递给 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++ 宏吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 将列表作为参数传递给函数

如何使用 QT 和 C++ 将字符串参数传递给函数

c++ 在创建时将构造函数参数从父对象传递给子对象

如何将 lambda 表达式作为参数传递给 c++ 模板

将 QObject 指针从 QML 对象传递给 C++

如何从.net代码将表值参数传递给存储过程