C++宏参数匹配规则是什么?给定num宏为何能识别对应调用语句?
C++ 宏参数匹配规则
- 宏参数匹配发生在预处理阶段,仅做纯文本拆分,不做任何C++语法、语义校验。
- 拆分参数时默认按逗号分割,逗号如果包裹在成对的小括号、中括号、大括号内则不会作为参数分隔符。
- 定义了可变参数(末尾用
...声明)的宏,调用时传入的参数个数只需要不少于固定参数的个数即可:优先按顺序填满前面所有固定参数,剩余的所有内容(包括其中的非括号内逗号)全部归到可变参数部分,不需要单独做匹配校验。 - 宏定义中的参数名仅为占位符,和调用时传入的标识符重名不会产生任何关联,匹配完全按参数顺序执行。
示例宏的匹配逻辑
你给出的宏定义为:
#define num(_5, _4, _3, _2, _1, N, ...) N
其中固定参数共6个,按顺序是_5、_4、_3、_2、_1、N,末尾的...声明了可变参数,宏的展开规则是直接返回第6个固定参数N。
调用语句num(a, b, _5, _4, _3, _2, _1)共传入7个参数,匹配结果如下:
- 第1个固定参数
_5匹配传入值a - 第2个固定参数
_4匹配传入值b - 第3个固定参数
_3匹配传入值_5 - 第4个固定参数
_2匹配传入值_4 - 第5个固定参数
_1匹配传入值_3 - 第6个固定参数
N匹配传入值_2 - 剩余的1个传入值
_1归到可变参数部分,因为宏展开时没有用到可变参数,这部分内容会被直接丢弃。
最终该宏调用的展开结果为_2,对应代码等价于:
int num_macro_parameters = _2;
注意:宏定义里的
_5、_4等参数名和调用时传入的同名标识符没有任何绑定关系,仅靠顺序匹配,所以不会出现重名导致的匹配异常。
内容的提问来源于stack exchange,提问作者fl0a1e
相关产品推荐
相关产品推荐

