Sharing static variables across files: namespace vs class
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;
}
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, 2022Comments
-
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 almost 12 years@Morpork: Note that
kode
is declaredextern
here, notstatic
. That's important. -
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 almost 12 yearsNever really thought about it, just reflexively. Something about it seems inelegant.