4

ac プログラムを実行するときにヘッダー ファイルをインクルードしないとどうなりますか? 警告が表示されることはわかっていますが、プログラムは完全に実行されます。

ヘッダー ファイルに関数宣言が含まれていることは知っています。したがって、それらを含めない場合、コンパイラはどのようにそれを理解するのでしょうか? すべてのヘッダファイルをチェックしますか?

4

5 に答える 5

7

警告が表示されることはわかっていますが、プログラムは完全に実行されます。

これは、ANSI 以前の C の不幸な遺産です。言語は関数プロトタイプを必要としなかったため、標準 C では今日までそれが許可されています (通常、プロトタイプなしで呼び出された関数を見つけると、警告が生成されます)。

プロトタイプなしで関数を呼び出すと、C コンパイラは、呼び出される関数について次のように仮定します。

  • 関数の戻り値の型はint
  • すべてのパラメーターは宣言されていると見なされます (つまり、可変引数はありませ...ん)。
  • すべてのパラメーターは、デフォルトのプロモーションの後に渡すものと見なされます。

プロトタイプなしで呼び出される関数がこれらの仮定に適合する場合、プログラムは正しく実行されます。それ以外の場合は、未定義の動作です。

于 2013-04-26T16:47:29.677 に答える
0

ヘッダーを省略すると、できないことがたくさんあります。

(私の記憶がこれについて失敗しているので、コメントからもう少し得たいと思っています...)

  • ヘッダーで定義されているマクロは使用できません。これは重要な場合があります。
  • ヘッダーが関数のパラメーターを定義しているため、コンパイラーは関数を適切に呼び出していることを確認できません。
于 2013-04-26T16:46:11.947 に答える
0

古いプログラムとの互換性のために、C コンパイラは、パラメータと戻り値が型であると仮定して、宣言されていない関数を呼び出すコードをコンパイルできますint。何が起こる可能性がありますか?たとえば、次の質問を参照してください: Troubling conversion string to long long in C 必要なヘッダーを含めず、使用する関数を宣言しない場合に発生する可能性がある問題の素晴らしい例だと思います。男に何が起こったのかは、宣言されている場所atollを含めずに使用しようとしたことです:stdlib.hatoll

char s[30] = { "115" };
long long t = atoll(s);
printf("Value is: %lld\n", t);

驚いたことに、これは予想どおり0ではなく115を出力しました! なんで?コンパイラは の宣言を認識せず、そのatoll戻り値が であると想定したintため、関数によってスタックに残された値の一部のみが選択されたため、つまり、戻り値が切り捨てられました。

-Wallこれが、 (すべての警告をオンにして)コードをコンパイルすることをお勧めする理由です。

于 2013-04-26T16:48:09.437 に答える