可以将逗号和args传递给C ++宏吗?

时间:2018-05-19 15:52:38

标签: c++

想知道是否可以为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

1 个答案:

答案 0 :(得分:4)

你不能直接这样做。具有两个参数的宏需要传递两个参数,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__))

此版本在MSVCGCCClang

上编译