101

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?

8
  • 4
    @ Lightness Races in Orbit: I need them because I want to exchange data between two functions that don't call each other. Commented Mar 14, 2012 at 12:47
  • 2
    @MarcusTik: Alright. Be sure to use a namespace, at least. Commented 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-variables Commented 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". Commented Mar 14, 2012 at 13:50
  • 1
    @undefinedbehaviour: It is. In that example you introduced a point-of-declaration problem, which is entirely unrelated. Commented Mar 26, 2014 at 18:54

5 Answers 5

137

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.

Sign up to request clarification or add additional context in comments.

8 Comments

Can I use extern for user defined types? means declaring the object without defining it?
@meet: Yes, for any object.
Would it work and does it make a difference if the extern keyword is included for a non-constant variable?
@AaronFranke: You mean, like in "possibility 1" shown above?
@BoundaryImposition Yes
|
88

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

I think you should declare the variable type in globals.cpp too, i.e. int x = 1337. int is the default data type so in this case it will probably work, but...
nm, I just stumbled over this once and it took me a long time to understand what the compiler actually wanted from me...
@arne: There are no "default data types" in C++.
@LightnessRacesinOrbit: OK, I dimly remember that there was something like that in C. If it isn't in C++, I have to revoke my comment.
I don't know if this is common or not but I like to call these extern ones "superglobals"
6

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

1

Declare extern int x; in file.h. And define int x; only in one cpp file.cpp.

1 Comment

Wasn't this already covered by an earlier answer?
-2

Not sure if this is correct in any sense but this seems to work for me.

someHeader.h inline int someVar; 

I don't have linking/multiple definition issues and it "just works"... ;- )

It's quite handy for "quick" tests... Try to avoid global vars tho, because every says so... ;- )

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.