C99 標準のデフォルト引数昇格について質問があります。「C Programming - A Modern Approach, 2nd Edition」という本の中で、私は次のことを読みました。
引数の変換:
[...]
1)呼び出しの前に、コンパイラーがプロトタイプに遭遇しました。[...]
2)コンパイラは、呼び出しの前にプロトタイプに遭遇していません。コンパイラはデフォルトの引数昇格を実行します: (1)
float
引数は に変換されdouble
ます。(2) 整数昇格が実行され、char
とshort
引数が に変換されint
ます。( C99 では、整数昇格が実行されます。 )
数行先には、呼び出す前に関数のプロトタイプまたは定義がない例が示されています。以下のようにコメントされています。
もちろん、より良い解決策は、
square
呼び出す前に のプロトタイプを提供することです。C99 では、square
最初に関数の宣言または定義を提供せずに呼び出すとエラーになります。
この二つの筆記体の文章は相反するものではないですか。つまり、C99 が以前の宣言/定義なしで関数を呼び出すことを禁止している場合、その種の関数呼び出しでプロモーションをどのように決定できますか?