C/C++宏函数传入数组参数是纯文本替换还是指针处理?
结论
该场景下宏参数temp_sort_array在宏展开阶段仅做纯文本替换,不存在宏"识别为指针处理"的逻辑;后续代码中表现出的指针相关特性,是宏替换完成后C/C++编译阶段的语言规则生效导致的,和宏本身无关。
分阶段行为说明
预处理器处理宏时,完全不做任何语法解析、类型判断,既不认识数组,也不认识指针,只做严格的文本匹配替换:你传什么文本内容到对应参数位,就把宏定义里对应占位符原封不动替换成这段文本。
你给出的示例代码经过宏展开后,等价于如下手写代码:uint8 temp_sort_array[6]; (temp_sort_array[0] == 5 /*band*/) && (temp_sort_array[1] == 4 /*band*/)提示:你贴出的原始示例中数组定义行末尾缺少分号,属于语法错误,实际编译会直接报错。
宏展开结束后,代码才会进入正式编译流程,此时才会触发C/C++标准规定的数组退化规则:当数组名出现在下标运算、值传参等场景时,会隐式转换为指向数组首元素的指针,再执行后续运算。这个转换是语言本身的固有行为,哪怕你完全不使用宏,直接手写
temp_sort_array[0]这类表达式,数组名一样会发生这个指针转换,和宏的处理逻辑没有任何关联。
内容的提问来源于stack exchange,提问作者gordon_zheng
相关产品推荐
相关产品推荐

