私はいくつかの C チュートリアルに従っていますが、理解できない点があります。一部の例では、関数のプロトタイプを示していますが、関数の定義はありません。チュートリアルでは、実行されなくても、コードは正常にコンパイルされるはずであると書かれています。
これは正しいです?関数定義が欠落している C プログラムは正常にコンパイルされますか?
私はいくつかの C チュートリアルに従っていますが、理解できない点があります。一部の例では、関数のプロトタイプを示していますが、関数の定義はありません。チュートリアルでは、実行されなくても、コードは正常にコンパイルされるはずであると書かれています。
これは正しいです?関数定義が欠落している C プログラムは正常にコンパイルされますか?
ソース コードは宣言のみでコンパイルされますが、いずれかの関数が呼び出されると、関数がどこかに定義されていないとリンカ エラーが発生します。
はい、これは正しいです。これは、大きなプログラムを複数のソースファイルに分割できるようにする機能です。
関数宣言と関数定義には大きな違いがあります。関数を使用するには、最初に関数を宣言する必要がありますが、使用する関数が定義されている場合にのみプログラムをコンパイルできます。
C コンパイル プロセスは、一連のステップを別のステップにフィードするものです。典型的なコンパイル プロセスでは、最初にプリプロセッサが実行され、次にコンパイラが各ソース ファイルのアセンブリ言語を生成し、次にアセンブラがそのアセンブリ言語をマシン コードに変換し、リンカが必要なすべての要素をまとめます。関数を宣言しない限り、コンパイラのステップは通常終了しませんが、コンパイラは関数が実際に実装されている場所を気にしません。実際の関数への呼び出しを配置できる穴のあるアセンブリ言語コードを生成するだけです。リンカーは、実際の関数の呼び出しでこれらの穴を埋めます。
したがって、関数を宣言して別のファイルで定義することができます。これは、おそらくチュートリアルが行っていたことです。ただし、関数をどこかに定義する必要があります。そうしないと、完全な実行可能バイナリを取得できません。
はい、リンクと呼ばれるものがあります。これは、変数、関数などのさまざまなシンボルへの参照を解決するプロセスです。コンパイラは、関数の定義について何も知らなくても問題ありません。ただし、コンパイラが関数のプロトタイプを認識している場合は、関数が正しく使用されているかどうかを確認できるため、エラーが早期に報告されます。
リンクの詳細については、Wikipediaまたは Google を参照してください。