I know one should not use global variables but I have a need for them. I have read that any variable declared outside a function is a global variable. I have done so, but in another *.cpp file, that variable could not be found. So it was not really global. Isn't it so that one has to create a header file GlobalVariabels.h and include that file to any other *cpp file that uses it?
- 4@ Lightness Races in Orbit: I need them because I want to exchange data between two functions that don't call each other.Marcus Tik– Marcus Tik2012-03-14 12:47:43 +00:00Commented Mar 14, 2012 at 12:47
- 2@MarcusTik: Alright. Be sure to use a namespace, at least.Lightness Races in Orbit– Lightness Races in Orbit2012-03-14 12:49:45 +00:00Commented Mar 14, 2012 at 12:49
- "I have done so, but in another *.cpp File that variable could not be found. So it was not realy global." - "Global" means that they are not destroyed until the program ends (as opposed to local variables with block scope that are destroyed when the block ends.) and can be accessed somehow from other translation units. See for details: learncpp.com/cpp-tutorial/42-global-variablesSChepurin– SChepurin2012-03-14 13:13:04 +00:00Commented Mar 14, 2012 at 13:13
- @SChepurin: "global" scope doesn't say anything about linkage whatsoever. I concede that usage of the term "global" on its own may be inconsistent: that tutorial appears to consider "global" to mean "global scope and linkage", as opposed to "namespace scope" which refers to a TU-local "global".Lightness Races in Orbit– Lightness Races in Orbit2012-03-14 13:50:03 +00:00Commented Mar 14, 2012 at 13:50
- 1@undefinedbehaviour: It is. In that example you introduced a point-of-declaration problem, which is entirely unrelated.Lightness Races in Orbit– Lightness Races in Orbit2014-03-26 18:54:50 +00:00Commented Mar 26, 2014 at 18:54
5 Answers
I have read that any variable declared outside a function is a global variable. I have done so, but in another *.cpp File that variable could not be found. So it was not realy global.
According to the concept of scope, your variable is global. However, what you've read/understood is overly-simplified.
Possibility 1
Perhaps you forgot to declare the variable in the other translation unit (TU). Here's an example:
a.cpp
int x = 5; // declaration and definition of my global variable b.cpp
// I want to use `x` here, too. // But I need b.cpp to know that it exists, first: extern int x; // declaration (not definition) void foo() { cout << x; // OK } Typically you'd place extern int x; in a header file that gets included into b.cpp, and also into any other TU that ends up needing to use x.
Possibility 2
Additionally, it's possible that the variable has internal linkage, meaning that it's not exposed across translation units. This will be the case by default if the variable is marked const ([C++11: 3.5/3]):
a.cpp
const int x = 5; // file-`static` by default, because `const` b.cpp
extern const int x; // says there's a `x` that we can use somewhere... void foo() { cout << x; // ... but actually there isn't. So, linker error. } You could fix this by applying extern to the definition, too:
a.cpp
extern const int x = 5; This whole malarky is roughly equivalent to the mess you go through making functions visible/usable across TU boundaries, but with some differences in how you go about it.
8 Comments
extern keyword is included for a non-constant variable?You declare the variable as extern in a common header:
//globals.h extern int x; And define it in an implementation file.
//globals.cpp int x = 1337; You can then include the header everywhere you need access to it.
I suggest you also wrap the variable inside a namespace.
5 Comments
int x = 1337. int is the default data type so in this case it will probably work, but...extern ones "superglobals"In addition to other answers here, if the value is an integral constant, a public enum in a class or struct will work. A variable - constant or otherwise - at the root of a namespace is another option, or a static public member of a class or struct is a third option.
MyClass::eSomeConst (enum) MyNamespace::nSomeValue MyStruct::nSomeValue (static) Comments
Declare extern int x; in file.h. And define int x; only in one cpp file.cpp.