基礎知識 | 每日一面(66)
- 2020 年 4 月 2 日
- 筆記

古代的劍客們與
對手相逢時,無
論對手多麼強大,
明知不敵,也要亮出自己的劍!
讀者:很多 ANSI 編譯器在遇到以下程式碼時都會警告類型不匹配。ex-
tern int func(float); int func(x) float x; { ...
小林:你混用了新型的原型聲明 「extern int func(float);」 和老式的定義 「int func(x) float x;」。通常這兩種風格可以混同, 但是這種情況下不行。
舊的C編譯器會 「放寬」 傳入函數的某些參數。浮點數被升為雙精度浮點數, 字元和段整型被升為整型。對於舊式的函數定義, 參數值會在被調函數的內部自動轉換為對應的較窄的類型, 如果在函數中那樣聲明了。
這個問題可以通過在定義中使用新型的語法一致性:
int func(float x) { ... }
或者把新型原型聲明改成跟舊式定義一致。
extern int func(double)
這種情況下, 如果可能, 最好把就是定義也改成使用雙精度數。毫無疑問, 在函數參數和返回值中避免使用 「窄的」 (char, short int 和 float)類型要安全得多。
有時候,正是那些意想不到之人,成就了無人能成之事。
——圖靈

