11

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.

2
  • 2
    static is probably the single most overloaded keyword in C++. It means something different in both those contexts. Commented May 10, 2012 at 13:30
  • 2
    ... and in this particular case, just the opposite of what you want. Commented May 10, 2012 at 13:31

1 Answer 1

22

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;
}
Sign up to request clarification or add additional context in comments.

3 Comments

@Morpork: Note that kode is declared extern here, not static. That's important.
@John Yes, I had a feeling there was no avoiding extern when multiple files are involved. Except for a static variable in a class of course. Thanks for the very fast responses, all.
Never really thought about it, just reflexively. Something about it seems inelegant.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.