12.4 很多 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

参考资料: [K&R1, Sec. A7.1 p. 186]; [K&R2, Sec. A7.3.2 p. 202]; [ISO, Sec. 6.3.2.2, Sec. 6.5.4.3]; [Rationale, Sec. 3.3.2.2, Sec. 3.5.4.3]; [H&S, Sec. 9.2 pp. 265-7, Sec. 9.4 pp. 272-3]。

翻译朱群英、孙云, LaTeX2HTML 编译 朱群英 (2005-06-23)