2017-11-03 13 views
-1

は、私は次のpargraphクラスの実装が変更されたときにヘッダで完全に定義されたクラスを使用するソースファイルを再コンパイルする必要があるのはなぜですか?クラス定義の変更、クラスを使用 ソースファイルはいつでもクラス 変更を再コンパイルする必要がある場合に、ユーザー・コードが変更する必要はないが、リップマン帳にカプセル化について読ん

を見つけました。

私はそれを使用するソースファイルを再コンパイルしなければならない、なぜ私は、x+2を返すようにx_plus()の体を変更した場合、私は次のコード

class A { 
private: 
    int x; 

public: 
    A() { x = 0; } 

    int x_plus(); 
} 

int A::x_plus(){ return x + 1; } 

を持っていると仮定すると?

私はそれがC++によるプロセスのリンクに関係すると思いますが、そうですか?

+0

あなたの質問はあまり意味がありません。 (変更されたすべてのコードと共に)クラス定義を再コンパイルする必要があります。そのすべては明白で自動です。 – xyious

+0

@xyious、クラスを使用するユーザーコードについて質問しています。クラスのソースコードではありません。 –

+0

C++ビルド・ツールは非常に簡単な依存性チェックを使用しますが、ソース・ファイルのタイムスタンプのみを参照します。したがって、インライン関数定義を使用しないで* .hファイルの宣言と.cppファイルの実装を使用する場合、このような変更によって他のソースファイルが再構築されることはありません。 –

答えて

3

クラス定義内に関数定義を置くと、デフォルトではインライン関数として扱われます。つまり、呼び出し元には、関数本体がコピーされる可能性があります。定義を変更すると、再コンパイルしない限り、呼び出し元には古い定義が含まれます。

は、あなたがその定義クラスのヘッダーファイルにない機能を変更した場合は、発信者を再コンパイルする必要はありません、あなたはちょうどそれらを再リンクする必要がFunction declaration inside or outside the class

を参照してください。これはクラス定義の変更とは見なされないので、リップマンの本の引用は当てはまりません。これを見て

簡単な方法は、クラスのコードが.oファイルにコンパイルさ.cppファイルになりながら、クラス定義は、.hファイルであるべきであるということです。 .hファイルを変更する場合は、<include filename.h>を含むものをすべて再コンパイルする必要があります。 .cppファイルに変更を加えた場合は、.oファイルを再コンパイルし、それを使用する実行可能ファイルを再リンクします。アプリケーションビルドツール(Unixのmakeなど)は自動的にこれを処理する必要があります。

+0

LTOを使用している場合は、インラインで定義されていない場合でもこの問題が発生する可能性があります; –

+0

私はこの例を自分で追加しました。 インライン関数のない別の状況を想定する(クラス外で定義された関数の実装の変更) –

+0

クラス定義外の非インライン関数の実装を変更した場合、呼び出し元を再コンパイルする必要はありません。そのクラスの '.o'ファイルに再リンクしてください。 – Barmar

関連する問題