3

私は思い切って C を学んでいます。スクリプト (php、perl) のバックグラウンドがあり、C# を少ししか使っていないため、学習曲線はかなり良好ですが、扱いやすいものです。

私は Web サイト「Learn C The Hard Way」を使用しており、これまでのところかなりよく理解できています (と思います) が、演習の 1 つのこの部分を理解できません。

http://c.learncodethehardway.org/book/ex19.html

彼は、object.h、object.c、ex19.h、ex19.c の 4 つのソース ファイルを作成しました。

しかし、object.c ファイルがどのように含まれているのかわかりません。

メイン関数は ex19.c にあり、次の行があります。

#include "ex19.h"

ファイル ex19.h には次の行があります

#include "object.h"

しかし、object.h は object.c のインクルードを参照していません。興味深いことに、object.c には次の行が含まれています。

#include "object.h"

ヘッダー ファイルをインクルードすると、同じ名前の C ソース コードが自動的にインクルードされるような暗黙のインクルードがありますか?

4

3 に答える 3

6

これは、リンカーと呼ばれる別のプログラムの仕事です。C では、ソース ファイルは他の C ソース ファイルのヘッダー ファイルにアクセスして、最初のファイルが使用する可能性のある 2 番目の C ファイルで定義されている関数、型、および変数に関する情報を確認できる必要があります。各 C ファイルは、残りのファイルとは別にコンパイルされます。コンパイラの出力はオブジェクト ファイルです

最終的なプログラムを構築するために、リンカーと呼ばれる 2 番目のプログラムが登場し、すべてのオブジェクト ファイルを結合して全体的な実行可能ファイルを作成します。このプログラムは、すべての異なる C ファイルの実装を取得し、それらを互いに相互参照して、ある C ファイルが別の C ファイル内の関数または変数を参照するたびに、その参照が実際に適切なオブジェクトに対して行われるようにする役割を担っています。 .

.cこれが、ファイルを含める必要がない理由です。ソースファイルにヘッダーがあると、他のファイルについて十分に認識して、コンパイラーがそれらを正しく使用していることを確認するために提供する関数を使用できます。リンカは、相互参照を実際に作成するジョブを処理します。コンパイラは、関数が定義されている場合にプログラムが機能するかどうかをチェックするプログラムと考えることができます。次に、リンカーは実際にそれらの関数が最初に定義されていることを確認し、実行可能ファイルに適切なリンクを設定します。

お役に立てれば!

于 2013-02-08T04:36:57.137 に答える
1

Object.c は含まれていません。

独自のユニットとしてコンパイルされ、object.h が含まれています。

メイクファイルを参照してください。

CFLAGS=-Wall -g

all: ex19

ex19: object.o

clean:
  rm -f ex19

ex19: object.oex19 をビルドする前に object.o を作成する必要があることを示しています。これは、object.c が存在するため、make ファイルからデフォルトで取得されます。

したがって、このmakeファイルは

ex19 が必要なすべてをビルドするには、ex19 を取得するには object.o が必要で、object.o を作成するには、makefile が object.c からビルドされた object.o を取得します

参考にしたページより:

make は object.o のファイル内で何も見ることができませんが、object.c ファイルを見て、.c を .o に変換する方法を知っているので、それを行います。

于 2013-02-08T04:38:10.837 に答える
0

ロジック全体は、メイクファイルとインテリジェント コンパイラにあります。作成された最終的なバイナリには、object.o という名前のオブジェクト ファイルがあり、object.h ファイルで定義されたすべての関数定義が理想的に含まれます。.h ファイルで宣言された関数と .o ファイルで使用可能な定義をリンクするリンカです。

于 2013-02-08T04:58:01.127 に答える