ac プログラムを実行するときにヘッダー ファイルをインクルードしないとどうなりますか? 警告が表示されることはわかっていますが、プログラムは完全に実行されます。
ヘッダー ファイルに関数宣言が含まれていることは知っています。したがって、それらを含めない場合、コンパイラはどのようにそれを理解するのでしょうか? すべてのヘッダファイルをチェックしますか?
警告が表示されることはわかっていますが、プログラムは完全に実行されます。
これは、ANSI 以前の C の不幸な遺産です。言語は関数プロトタイプを必要としなかったため、標準 C では今日までそれが許可されています (通常、プロトタイプなしで呼び出された関数を見つけると、警告が生成されます)。
プロトタイプなしで関数を呼び出すと、C コンパイラは、呼び出される関数について次のように仮定します。
int
...
ん)。プロトタイプなしで呼び出される関数がこれらの仮定に適合する場合、プログラムは正しく実行されます。それ以外の場合は、未定義の動作です。
ヘッダーを省略すると、できないことがたくさんあります。
(私の記憶がこれについて失敗しているので、コメントからもう少し得たいと思っています...)
古いプログラムとの互換性のために、C コンパイラは、パラメータと戻り値が型であると仮定して、宣言されていない関数を呼び出すコードをコンパイルできますint
。何が起こる可能性がありますか?たとえば、次の質問を参照してください: Troubling conversion string to long long in C 必要なヘッダーを含めず、使用する関数を宣言しない場合に発生する可能性がある問題の素晴らしい例だと思います。男に何が起こったのかは、宣言されている場所atoll
を含めずに使用しようとしたことです:stdlib.h
atoll
char s[30] = { "115" };
long long t = atoll(s);
printf("Value is: %lld\n", t);
驚いたことに、これは予想どおり0
ではなく115
を出力しました! なんで?コンパイラは の宣言を認識せず、そのatoll
戻り値が であると想定したint
ため、関数によってスタックに残された値の一部のみが選択されたため、つまり、戻り値が切り捨てられました。
-Wall
これが、 (すべての警告をオンにして)コードをコンパイルすることをお勧めする理由です。