2017-05-02 26 views
0

私はコンパイルプロセスのさまざまな段階を読んでいました。私はリンクフェーズに達したとき、それはそれがexeファイルにするために1つに定義されたライブラリとユーザーのオブジェクトファイルをリンクすることがわかりました。しかし、前処理はすでに文#includeをその内容(すなわちprintfなどの関数の定義)に置き換えました。 私はどこかに間違っていることを知っていますが、間違って理解したことはありますか?リンクと前処理

+0

[コンパイル/リンク処理はどのように機能しますか?](http://stackoverflow.com/questions/6264249/how-does-the-compilation-linking-process-work) – niceman

+1

ヘッダーファイルは作成できません。関数の定義、宣言のみを含みます。 – sepp2k

答えて

0

一般に、ライブラリヘッダーは関数を宣言し、定義しません。 .hファイルを見ると、(例を使用すると)何かが表示されます。

extern int printf (const char *fmt, ...) ; 

多くの実装では、これらの宣言は、追加のマクロによって隠されているが

この宣言には、printfという関数があります。この関数は、ポイントを文字として引数にとり、そのあとに可変数の指定されていない引数を指定します。

これにより、コンパイラは、コード内のprintfの呼び出しが関数の呼び出しシーケンスとして宣言されているものと一致するかどうかを確認できます。

自分でprintfを書いてコードに含めるのでなければ、プログラムをコンパイルするときにprintfはありません。

リンカーは、リンカーを自動的に呼び出すようにコンパイラーを呼び出すと、リンカーは指定されたライブラリーを検索してprintfが含まれているものを探し、実行可能ファイルにコードを含めます(共有ライブラリ)。

+0

今私は理解した。以前は、ヘッダーファイルには、指定されたいくつかの関数を使用するためにstdio.hをインクルードしたときのように、すべての定義が含まれていると思いました。 –