2011-02-12 18 views
0

を宣言するCarClass.hファイルがあります。
私は#importこのCarClass.hファイルに私のCarClass.mファイルに私は当然すべて私のCarClassの方法を実装するつもりです。
最後に、私のCarAPP.mファイル(これにはmainが含まれています)ALSO CarClass.h - すべて正常です。が表示されますが、それらは完全にリンクされていますか?

Ssが、私はそれが動作する理由を理解わからないんだけど、しかし

:-)が、実際には問題はありません - リンケージが少しオフに思わ原因: - もインポートせずCarAPP.m輸入する場合にのみCarClass.hファイルをCarClass.mファイル、次にどこから実装を取得するか見るか? ".h"ファイルをインポートする ".m"ファイルがコンパイルされると、2つのファイル(.hと.m)は永遠にリンクされているのでしょうか? 私はちょうどそれを取得しません...

答えて

1

コンパイルプロセスは異なるフェーズで分割され、#importディレクティブはリンケージが発生するずっと前に解釈されます。

コンパイラにコードファイル(.c、.m)を渡すと、コードオブジェクトファイル(.o)が生成されます。つまり、コードのバイナリ表現です。このファイルは、より多くの情報が必要なため、まだ実行可能ではありません。特に、他のファイルにはリンクされていません。宣言と定義を含まないヘッダーファイルは、通常、独自の.oファイルに一致しません。

すべてのコードファイルをコードオブジェクトにした後、コンパイラはそれらをすべてまとめてリンカを呼び出します。リンカーはすべての外部参照を解決し、実行可能ファイルを生成します。

要点は、ヘッダファイルが、関数またはメソッドがあるとコンパイラに伝えることです。です。コンパイルの現段階では、オブジェクトファイルを生成するのに十分です。コンパイラは、定義がどこに存在するかを知る必要があります。実際にリンクしている場合にのみ、これを知る必要があります。

すべてのコードオブジェクトファイルはパッケージ化されているので、プログラム全体が一般的に宣言されたすべてのものにアクセスできます。このため、CarAPP.mをCarClass.mに対して明示的に「リンク」する必要はありません。

コンパイラを誤解させ、どこにも定義されていないヘッダファイルの関数を宣言することもできます。あなたのプログラムでそれらを使用すると、コンパイルの最初のフェーズはうまく行きます(構文エラーも "宣言されていない関数"もありません)が、リンカは存在しない関数を見つけることができないので、 。

+0

これは間違いなく、私が何も知らないすべての神秘的なバックグラウンド動作についてより多くの光を放つ。例えばリンカと呼ばれるものがあったことさえ知りませんでした。知らない私の言い訳は、私は初心者です:-)とにかく、ありがとう - 良いもの! – Sirab33

0

#import whatEver.hがある場合、プリプロセッサは、デフォルトの場所で対応するファイルを見つけようとします。見つかった場合は、whatEver.hの内容を対応するソースファイルにペーストします。ここでは#import whatEver.hを使用します。したがって、最終実行可能ファイルを取得するには、ソースファイルがPre-Process、Compile、およびLinkerの各段階を通過する必要があります。

CarClass.hCarAPP.mにある場合、リンカーはCarClass.hの実装がCarClass.mにあると判断します。厳密に言うと、それはCarClass.oの定義を見つけることになります。コンパイラは、使用する宣言が存在し、使用するときに宣言の定義がある限り、リンカは幸せである限り、満足しています。

あなたCarAPP.mからCarClass.hをインポート

は、あなたが CarClass.oCarClass.hメソッドの実装を見つけるために、リンカに言っています。したがって、最終実行ファイルは CarAPP.oCarClass.oの組み合わせです。コンパイルとリンクの方法について詳しくは、 Program Compilationを参照してください。リンクはC/C++固有のものですが、それはあなたに考えを与えるはずです。

+0

興味深い - よく知っておいてください。私は ".o"ファイルについて全く知らなかった。そのようなサウンドは、チェーン全体の "欠落したリンク"を理解するための鍵です。ありがとうございました! :-) – Sirab33

関連する問題