2012-03-27 13 views
0

言語を学ぶいくつかの本を使って作業したところ、初めての本物のC++アプリケーションを手に入れました。 あなたのcppソースファイルには対応するヘッダーが必要ですが、私のプロジェクトのライブラリの1つは、対応するヘッダーを含まないいくつかのcppファイルでうまく構築されています。この特定のcppは、元のクラス宣言だけではなく、異なる名前と他の多数のコードを持つヘッダーにあるクラスを実装します。対応するヘッダのないcppをコンパイルしてください

どのようにして、cppは知識のないクラスに属する関数をコンパイルできますか?

これらの関数の実装は独立してコンパイルでき、ライブラリを使用するクライアントアプリケーション(およびクラス宣言を含むヘッダーを含む)が対応するメンバ関数を呼び出すときに呼び出されますか?この場合、クライアントアプリケーションが実装バイナリをどのように参照していますか? (私はこれがリンカであると仮定します...しかし、私はこれをクリアしてもらいたいです)。

私は、その答えがインクルードとコンパイルのプロセスに関して私の誤解を露呈するかもしれないと思っています。私は本当にC++のこの面をうまく学びたいと思っています。ありがとうございました!

+1

ヘッダーファイルは翻訳単位に文字通り含まれています。魔法はありません。逆に、ヘッダファイルは1970年代の驚くほど粗雑な遺物である。あなたはヘッダーファイルをまったく必要としません。その考えを真剣に受け止めるのは良い考えではありません。システム内の他のアクターに機能を提供しない翻訳ユニットをお持ちの場合、ヘッダーは必要ありません。良い例は、あなたの 'main'関数を含む小さな翻訳単位です。 –

+0

は、コンパイルとリンクについて、これを見ています:http://stackoverflow.com/questions/6264249/how-does-the-compilation-linking-process-work – Sanish

答えて

2

C++ソースファイルをコンパイルすると、最初の段階では前処理が行われます。 インクルード・ディレクティブに達すると、ファイルが見つかり、ファイルの内容全体がソース・ファイル自体に書き込まれているかのように、ソース・ファイルに含まれます。

あなたは、クラスの宣言を含む任意のソースファイル内のクラスから任意の関数を定義することができるようになります、これは「クラス/関数についてのソースファイル「を知ること」である。

という要件もありませんヘッダとソースファイルの内容には関係がありますが、これは非常に良い習慣と広く考えられています。

各コンパイルユニット(ソースファイル)の実装は独立してコンパイルされます。コンパイルユニットがリンクされている場合は、すべての宣言の用途がすべてのコンパイルユニットに一致します。定義。

ソースファイルとヘッダーファイルの間に1:1の関係以外の関係を持つ人がいるかもしれない他の唯一のパターンは、ヘッダーファイルがそれぞれクラスを記述し、各ソースファイルがコレクションを実装するということです関連する機能のしかし、これは(私の意見では)様々なクラスの定義が強く結びついていることを奨励するので、悪い考えです。

0

これらはいくつかの質問です。これらを分割しようとする必要があります。

  1. 何かが宣言されているファイルの名前は、関係しません。コンパイラは、プリプロセッサによって読み込まれたファイルから独立したプリプロセッサ出力を取得します。コンパイラは、より読みやすい診断メッセージを発行するために、前処理されたファイル内のいくつかのファイル/行情報を使用している可能性があります。 ヘッダーファイルにクラスを宣言し、その宣言を実装ファイルにコピーすると、宣言のコピーを変更しない限り、すべて正常に動作します。これは危険であり、避けるべきである。常に何かを宣言してください。

  2. クラスメンバー関数の実装をコンパイルすると、リンカーがクライアントプログラムにリンクできる関数が得られます。良いツールチェーンは、アクセスされた機能だけをリンクすることができます。したがって、静的ライブラリで提供されている実装とヘッダーファイルのインタフェースを分離することができます。リンカは、ライブラリ内の各オブジェクトモジュールを、すべてのシンボル参照が解決されるまで実行可能ファイルに追加します。

関連する問題