私の基本的な質問は、標準ライブラリ ルーチンを使用するためにコンパイル プロセスがどのように機能するかということです。C#include <stdio.h>
を使用する場合 、プリプロセッサは標準ライブラリ全体を取得してソース ファイルに貼り付けますか?
そうであれば、ライブラリ ルーチンを使用する場合、リンカがどのように関与するのでしょうか。
私の基本的な質問は、標準ライブラリ ルーチンを使用するためにコンパイル プロセスがどのように機能するかということです。C#include <stdio.h>
を使用する場合 、プリプロセッサは標準ライブラリ全体を取得してソース ファイルに貼り付けますか?
そうであれば、ライブラリ ルーチンを使用する場合、リンカがどのように関与するのでしょうか。
プリプロセッサは、その名前が示すように、コンパイラの前に実行されるプログラムです。単純なテキスト置換だけです。
ディレクティブが見つかると、#include
完全なファイルをディレクティブがあった場所に単に「貼り付け」ます。同じことがマクロ展開にも当てはまり、マクロの「呼び出し」が検出されると、マクロの本体がその場所に「貼り付け」られます。
プリプロセッサはライブラリとは関係ありません。C (および C++) では、すべての関数と変数を使用する前に宣言する必要があるため、プリプロセッサによってインクルードされるヘッダー ファイルに宣言を配置することは、ライブラリからこれらの宣言を取得する簡単な方法です。
ライブラリには基本的に 2 つのタイプがあります。ヘッダーのみのライブラリと、リンクが必要なライブラリです。最初のタイプのヘッダーのみのライブラリは、まさにその名前が示すとおりです。それらは、インクルードするヘッダー ファイルに完全に含まれています。ただし、ライブラリの大部分は、リンクする必要があるライブラリです。これは、コンパイラが作業を完了した後のステップで、特別なプログラムによって行われます。これがどのように使用されるかは、もちろん環境によって異なります。
一般に、プログラムのコンパイルは次の手順に分けることができます。
編集ステップは、ソースを作成するために行うことです。
多くの場合、プリプロセッサとコンパイルのステップは 1 つのステップにまとめられます。これがおそらく、プリプロセッサが実際に何をするかについて初心者の間で混乱が生じる理由です。
最後のステップであるリンクでは、コンパイラから入力を取得し、それを指定したライブラリと共に使用して、最終的な実行可能ファイルを作成します。
C でインクルードをパウンドすると、プリプロセッサは標準ライブラリ全体を取得してソース ファイルに貼り付けますか?
ヘッダー ファイルのみを#include
.
そうであれば、ライブラリ ルーチンを使用する場合、リンカがどのように関与するのでしょうか。
標準ライブラリのヘッダーには宣言のみが含まれます。関数の定義(実装) はライブラリ ファイルにあり、ほとんどの場合/usr/lib/libc.ext
( ext
OS 依存の拡張機能)。
ソース コードに何かを #include すると、プリプロセッサは #include した内容をソース ファイルに貼り付けます。ただし、具体的には、ライブラリからヘッダー ファイルをインクルードする場合は、 のような関数宣言をインクルードするだけvoid a();
であり、リンカーはライブラリ自体でこれらの関数の実装を見つけます。