1

たくさんのvoidメソッドを作成し、プログラムの後半でそれらを呼び出そうとしています。問題をよりよく理解するために、先にコードを示します。

.h file
static float sfloat;
namespace someNamespace
{
static void foo();
}
.cpp file
void someNamespace::foo(){cout<<sfloat<<endl}
  • 上記のコードは、私が取り組んでいたクラスのより単純なバージョンです。

他の.cppファイルでsfloatを初期化します

otherFile.cpp
void initializeAndUseFoo(){sfloat = 5; someNamespace::foo();}

私の理解では、fooは5を出力することを期待していますが、代わりに0を出力します。この動作は、私が持っている他のすべての静的変数(ポインターを含む)でも発生します。どういうわけか、関数内の変数は、私が割り当てた値として初期化されないようでした。

ただし、関数を介さずに「sfloat」を呼び出すと、適切に呼び出すことができます(コンソールで印刷するだけの場合)

cout<<"just print it not through the function : " <<sfloat<<endl;

それからそれは確かに5です

読んでくれてありがとう。

4

2 に答える 2

4

グローバル静的変数は、1つのコンパイルユニット内で静的です。別のコンパイルユニットを作成すると、その静的変数の別のコピーが作成されます。

このSOの質問は、C++でのコンパイル単位とは何かを説明しています。

変数は静的であると同時にグローバルであるため、そのコンパイルユニットにはその変数の単一のインスタンスがあります。別のファイルからその正確な変数にアクセスする場合は、externキーワードを使用する必要があります。これがないと、その変数の新しいコピーが各コンパイル単位で作成されます。たとえば、ここでいくつかの情報を見つけることができます。

于 2012-10-18T07:23:47.107 に答える
3

それはクラスではなく、名前空間です。static名前空間内またはグローバルスコープで、メソッドと変数に内部リンクを提供します。つまり、各翻訳ユニットでそれぞれのコピーを利用できるようになります。

で変更する(初期化sfloatしない)ためotherFile.cpp、そのバージョンの変数のみが変更されます。で初期化された元の.cpp file値は、同じ値(によって印刷されたバージョン)を保持しますsomeNamespace::foo()

于 2012-10-18T07:24:12.643 に答える