I have a variables.cpp, in which it defines:
static MyNamespace::MyClass myObj('input');
I have a variables.h that is included by variables.cpp
And I have a main.cpp that includes variables.h, which it refers to myObj:
MyNameSpace::myObj.doRun();
And the compiler complains that: no member named 'myObj' in namespace 'MyNameSpace'
What am I doing wrong?
CodePudding user response:
The very purpose of static variables is to be file scope, not visible in other files. So naturally they are not then visible, using static specifically requests that.
As a consequence, several .cpp files can have a static variable with same name, and they will be different variables. Also as a consequence, if you define a static variable in .h file, then every .cpp file which includes it will have a different variable.
Extra notes:
In C you can achieve similar effect (file scope) by putting the variables in anonymous namespace in the .cpp file.
staticclass member variables are a different case, they are visible everywhere (in other words, the variable symbol name is exported), and basically behave like non-static global variables which aren't member variables. Yes, it can be a bit confusing,statichas several different meanings in C .staticvariable can be accessed from other .cpp files, if you create a function which returns a reference (or a pointer) to it in the .cpp file where it is defined. It's lifetime is same as program execution, so this is safe from that point of view. However, thread safety and re-entrancy are then issues which need attention, so you shouldn't do this unless you know why you are doing this.
CodePudding user response:
as another answer point out, static variable is meant to not shared with others.
If you do want to share myObj, you should remove the static specifier
// variables.cpp
MyNamespace::MyClass myObj('input'); // no static
and declare it in header file
// variables.h
extern MyNamespace::MyClass myObj;
or, with c 17, another option is use inline variable.
// variables.h
inline MyNamespace::MyClass myObj('input');
// variables.cpp
// do not redeclare it
btw, 'input' is multicharacter literal, most likely not what you want.
