C99标准下const数组传入const指针形参的合规性验证
结论
你的理解完全符合C99标准规则,对应的调用不存在语法错误,你遇到的报错是ColdFire 5703 MCCCF旧编译器的实现缺陷导致的。
标准规则依据
根据C99的规定,你提到的两个核心逻辑都是成立的:
- 除了作为
sizeof、_Alignof、一元&运算符的操作数这三种特殊情况外,数组类型的表达式会自动隐式转换为指向数组首元素的指针。你将array作为函数实参传递的场景满足转换条件,此时array等价于&array[0]。 - 你定义的
array元素类型为const unsigned char,因此首元素的指针类型自然就是const unsigned char *,和func的形参类型完全匹配,不存在类型不兼容或者const限定符违规的问题。
旧编译器兼容方案
针对这类对C标准遵循度较差的嵌入式老旧编译器,你可以通过添加显式强制类型转换来规避误报,该操作是完全安全的,不会引入未定义行为:
func((const unsigned char *)array);
内容的提问来源于stack exchange,提问作者Guillaume Petitjean
相关产品推荐
相关产品推荐

