11.2 为什么ANSI编译器遇到以下代码会警告类型不匹配

问题:

很多ANSI 编译器在遇到以下代码时都会警告类型不匹配。

extern int func(float); int func(x) float x; { . . .

你混用了新型的原型声明“extern int func(float);” 和老式的定义“int func(x)float x;”。

通常这两种风格可以混同, 但是这种情况下不行。

旧的C 编译器(包括未使用原型和变长参数列表的ANSI C) 会“放宽” 传入函数的某些参数。

浮点数被升为双精度浮点数, 字符和段整型被升为整型。

对于旧式的函数定义, 参数值会在被调函数的内部自动转换为对应的较窄的类型, 如果在函数中那样声明了。

这个问题可以通过在定义中使用新型的语法一致性:

int func(float x) { ... }

或者把新型原型声明改成跟旧式定义一致。

extern int func(double);

这种情况下, 如果可能, 最好把就是定义也改成使用双精度数。

毫无疑问, 在函数参数和返回值中避免使用“窄的” (char, short int 和float)类型要安全得多。

参见问题1.8。

永不止步步 发表于01-16 15:08 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:345377个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号