0

私が理解したことから、静的メンバーを.hではなく.cppファイルで初期化する理由は、メンバーの複数のインスタンスを取得するリスクがないためです。次の例を見てください。

   //Foo.h
   #ifndef FOO_H
   #define FOO_H

   class Foo{
      static int a;

   }; 
   int Foo::a = 95; 
   #endif

プリプロセッサディレクティブは、この.hファイルが1回だけコンパイルされるようにします。これにより、静的メンバーのインスタンスが1つだけになります。.cppファイルで静的メンバーを開始する代わりにこれを行うことは可能ですか?

4

4 に答える 4

7

Foo.hいいえ、コンパイル単位(.cppファイル)ごとに1回だけ含まれることを保証します。プロジェクト全体ではありません。内で静的メンバーを定義する必要がありますFoo.cpp

于 2012-07-06T11:05:44.147 に答える
4

両方にヘッダーが含まれている2つのソースコードファイルとを用意することを検討してくださいa.cppb.cppそれらは互いに独立してコンパイルされるため、ヘッダーガードは機能せず、2つのオブジェクトファイルが作成a.oされb.o両方がを定義しますFoo:a。それらをリンクしようとすると失敗します。

于 2012-07-06T11:07:10.950 に答える
3

.cppヘッダーが複数のファイル(翻訳単位)に含まれている場合、これによりリンカーエラーが発生します。

//a.cpp
#include <Foo.h>

//b.cpp
#include <Foo.h>

コンパイル後a.obj、の定義が含まれ、の定義がFoo::a含まb.objれますFoo::b.objこれらの2つのファイルを単一のバイナリにリンクしようとすると、複数の定義エラーが発生します。

于 2012-07-06T11:05:45.440 に答える
1

いいえ、インクルードガードは、ヘッダーがコンパイル単位ごとに最大1回インクルードされることを保証します。プログラムにヘッダーを含む複数のコンパイル単位(.cppファイル)がある場合は、の定義が複数になりますFoo::a

于 2012-07-06T11:06:42.587 に答える