10

ここでは静的とグローバルについて多くの質問がありますが、私の質問は少し違うと思います。

クラスの静的変数と同じように、名前空間に配置された変数をファイル間で共有する方法があるかどうかを知りたいです。

たとえば、私はこれをコーディングしました:

//Foo.h
class Foo
{
  public:
  static int code;
  static int times_two(int in_);
};

namespace bar
{
  static int kode;
}

-

//Foo.cpp
int Foo::code = 0;

int Foo::times_two(int in_)
{
  bar::kode++;
  code++;
  return 2*in_;
}

-

//main.cpp
int main()
{
  cout << "Foo::code = " << Foo::code << endl;

  for(int i=2; i < 6; i++)
  {
    cout << "2 x " << i << " = " << Foo::times_two(i) << endl;
    cout << "Foo::code = " << Foo::code << endl;
    cout << "bar::kode = " << bar::kode << endl;

    if(i == 3)
    {
      bar::kode++;
    }
  }
}

コードとkodeでこれを生み出したのは次のとおりです。

Foo::code = 1,2,3,4
bar::kode = 0,0,1,1

繰り返しになりますが、クラスの静的変数と同じように、名前空間に配置された変数をファイル間で共有する方法はありますか?私が尋ねる理由は、::表記を使用することで、グローバル変数の競合から身を守ることができると思っていたのですが、それができないことがわかったからです。そして、他の自尊心のあるプログラマーのように、私はそれを間違っていると信じています。

4

1 に答える 1

21

はい:

//bar.h
namespace bar
{
  extern int kode;
}

classまたはの外でstructstatic、まったく異なる意味を持ちます。シンボルの内部リンケージを提供します。したがって、と同じ変数を宣言するとstatic、実際には、一意のグローバルではなく、すべての変換ユニットに対して異なるコピーが取得されます。

変数を一度初期化する必要があることに注意してください:

//bar.cpp
namespace bar
{
   int kode = 1337;
}
于 2012-05-10T13:29:02.853 に答える