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)