旧式C编写图形库遇参数匹配编译错误,求兼容解决方法
旧式C风格函数编译错误的解决方法
问题场景
使用旧式K&R风格编写图形库代码,启用编译标志-pedantic -pedantic-errors -Wall -Werror -Wextra -ansi时,出现编译错误:
error: promoted argument ‘scalar’ doesn’t match prototype
对应代码如下:
Vector2_t Graphics_vec2_scalar_fmul(Vector2_t, float); Vector2_t Graphics_vec2_scalar_fmul(a, scalar) Vector2_t a; float scalar; { a.x *= scalar; a.y *= scalar; return a; }
要求保持K&R代码风格,且不关闭pedantic-errors和Werror编译标志。
错误原因
在K&R风格的函数定义中,float类型参数会触发默认参数提升:float会被自动转换为double,而函数原型声明的参数类型是float,导致原型与实际接收的参数类型不匹配,触发严格编译检查错误。
解决方案
无需修改K&R风格的函数定义,仅调整函数原型的参数类型为double,使其与提升后的参数类型匹配:
// 修改原型的参数类型为double Vector2_t Graphics_vec2_scalar_fmul(Vector2_t, double); // 保持原K&R风格定义不变 Vector2_t Graphics_vec2_scalar_fmul(a, scalar) Vector2_t a; float scalar; { a.x *= scalar; a.y *= scalar; return a; }
或者,也可以将函数定义中的float scalar;改为double scalar;,同时将原型的参数类型也改为double,两种方式都能解决类型不匹配问题,且完全保留K&R代码风格。
内容的提问来源于stack exchange,提问作者user12649691
相关产品推荐
相关产品推荐

