想知道是否可以为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
答案 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__))
上编译