Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
148 views
in Technique[技术] by (71.8m points)

c++ - Sharing static variables across files: namespace vs class

There are a lot of questions about static vs global here but I think my question is a bit different.

I want to know if there is a way to share a variable placed in a namespace across files the way static variables in a class can.

For example, I coded this:

//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++;
    }
  }
}

All that yielded this for code and kode:

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

Once again, is there a way to share a variable placed in a namespace across files the way static variables in a class can? The reason I ask is because I thought I would be able to shield myself from confliciting global variables by using :: notation, and just found out I could not. And like any self-disrespecting programmer, I believe I am doing it wrong.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Yes:

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

Outside of a class or struct, static has a whole different meaning. It gives a symbol internal linkage. So if you declare the same variable as static, you will actually get a different copy for all translation units, not a unique global.

Note that you'll need to initialize the variable once:

//bar.cpp
namespace bar
{
   int kode = 1337;
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...