能否向C++宏传入逗号参数?如何用宏传递多参数给其他宏?
当然可以解决这个问题!你遇到的核心问题是C++预处理器的参数解析顺序:它会先分割宏调用的参数,再展开每个参数。当你直接写ADD_TWO(ZERO_COMMA_FORTY_TWO)时,预处理器一开始会把ZERO_COMMA_FORTY_TWO当成单个参数(因为括号里没有逗号),等展开成0,42之后,ADD_TWO已经被认定只收到了一个参数,自然会报参数数量不匹配的错误。
下面给你两种在VS2017中可行的解决方法:
方法一:用可变参数宏转发
定义一个接收可变参数的转发宏,让它帮你把展开后的参数正确传递给ADD_TWO:
#define ADD_TWO(first, second) first + second #define ZERO_COMMA_FORTY_TWO 0,42 // 转发宏:把收到的所有参数原封不动传给ADD_TWO #define CALL_ADD_TWO(...) ADD_TWO(__VA_ARGS__) int main() { int bar = CALL_ADD_TWO(ZERO_COMMA_FORTY_TWO); // 最终展开为0 + 42,结果是42 return 0; }
方法二:用中间宏触发二次展开
通过一层中间宏,让预处理器先展开你的逗号参数,再进行参数分割:
#define ADD_TWO(first, second) first + second #define ZERO_COMMA_FORTY_TWO 0,42 // 中间宏:负责接收参数并转发给目标宏 #define APPLY_MACRO(target_macro, ...) target_macro(__VA_ARGS__) int main() { int bar = APPLY_MACRO(ADD_TWO, ZERO_COMMA_FORTY_TWO); // 同样会展开为ADD_TWO(0,42) return 0; }
这两种方法都利用了C++11支持的可变参数宏特性,VS2017完全兼容,能完美解决你的问题。
内容的提问来源于stack exchange,提问作者buttonsrtoys
相关产品推荐
相关产品推荐

