Sharing static variables across files: namespace vs class

15,521

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;
}
Share:
15,521
Morpork
Author by

Morpork

Did not take up programming in varsity, but now (almost) devoting life to becoming the very best, like no one was before. Okay, maybe just better than the plebs. Okay, maybe just enough to scrape out a living.

Updated on July 04, 2022

Comments

  • Morpork
    Morpork almost 2 years

    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.

  • John Dibling
    John Dibling almost 12 years
    @Morpork: Note that kode is declared extern here, not static. That's important.
  • Morpork
    Morpork almost 12 years
    @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.
  • Morpork
    Morpork almost 12 years
    Never really thought about it, just reflexively. Something about it seems inelegant.