2012-02-09 23 views
10

メソッドを宣言して実装していないクラスがあります。このメソッドは仮想関数ではありません。対応するcppファイルでは、同じメソッドの定義が見つかりませんでした。クラス内で宣言された他のすべてのメソッドが定義されました。クラスで宣言されているが未定義のメソッド

私はコードをコンパイルし、うまくいった。私は、cppが宣言されたメソッドの定義を要求しなければならないという印象を与えました。

誰かが同じことを詳しく説明できるかどうか鑑賞してください。私はVS2010のclコンパイラを使用しています。

答えて

10

コードはコンパイルされますが、リンクエラーが発生します。プロジェクトの実行プログラムの構築

は、二つの段階を含む:コンパイル中にコンパイラを

をリンク

  • コンパイル
  • は、単に言語の意味論を検証することにより、ソースコードをオブジェクトコードに変換します。
    リンクするリンカは実際にシンボルの定義を検索し、複数のオブジェクトファイル(コンパイル時に作成された)から実行可能ファイルを作成します。

    コンパイラは、各翻訳単位(.cpp +ヘッダーファイル)のソースコードを個別にコンパイルするため、定義が他のソースファイルに存在する必要があるとみなします。関数定義への参照を見つけようとするのはリンカであるため、リンカが定義していない定義を報告します。リンカはは、あなたのプログラムでを使用しているシンボルのみ、元のために
    をリンクする必要があることを

    注:プログラムが関数を宣言した場合は、/何の定義&そして決して用途を提供しないどこでも関数を呼び出し、リンカーは関数呼び出しのサイトで関数のオブジェクトコードが存在するアドレスにジャンプするためのコードを埋め込む必要はありません。
    このようなシナリオでは、リンカは関数定義をまったく参照する必要はありません。したがって、コードはコンパイルおよびリンクされます。

+5

IMHO、欠落定義付きの関数が明示的に/暗黙的にどこかで使用/呼び出されている場合にのみリンクエラーが発生します。 – fizzbuzz

+0

@fizzbuzz:はい、もちろんです。それが基本的な基準です。 –

+0

コンパイルエラーまたはリンクエラーが表示されません。追加するだけで私はどこでもfuntionを使用していません。コードはコンパイルされ、.libファイルに細かくリンクされます。 – akrohit

3

特定のファイルにメソッドを実装する必要はありません。実際には、ライブラリーとリンクするときに、メソッドごとに1つのファイルを作成して膨れを減らすことは、良いプログラミング慣行と見なされていました(またはされました)。

これは、クラスを定義するヘッダーファイル(おそらくその中に実装されていない)を指定すると、コンパイラはすべての関数がどこかで実装されていると仮定することができます。システムが全てをまとめようとしているところ(リンク段階)には、あなたがそこにないものを参照していることが明らかになります。

+0

**メソッドごとに1つのファイル**?過剰だと思われる... –

+0

本当に。それははるかに少ない膨らみと驚くべきリンクの問題になります。現代のコンパイラの中には、それぞれの関数を別々のオブジェクトセクションに置くことで、必要をなくしているものもありますが、ほとんどの場合そうではありません。 –

+0

私はもう一度チェックして、私は上記の他のファイルでも話しているメソッドの定義を見つけることができませんでした。 – akrohit

3

割り当てやコピーを防止する一般的な方法です。それを宣言しても定義していないと、それを使用しようとするとリンクエラーが発生します。つまり、誤って使用してしまうのを防ぎます。

0

構文/コンパイラエラーがないため、 リンクする必要がないように、プログラム内の関数を呼び出さないため、リンカーは不平を言っていません。

関連する問題