Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Global variables and scope - C++

I am having small problem in making a global variable works. I am using Visual Studio 2008 and standard C++.

I have two projects, one is a static library and second one is a test program which uses this library. I have a global variable in global.h like

#ifndef GLOBAL_H
#define GLOBAL_H

#include <string>

extern std::string globalWord;

#endif // GLOBAL_H!

I have a global.cpp where I am initializing this variable. This variable is used inside my library project. I am setting a value to this variable from the test project, but that value is not getting reflected in the library project.

I have debugged and it shows the new value in test project, but when the control reaches the library project, this variable value shows empty. So is this global variable's scope only limited to the project where it belongs to?

Or is there a better way to do this? I don't want to modify my function or constructor parameters in my library to pass this value.

Any help would be great.

Edit:

Here is how this variable is declared in global.cpp

#include <string>
#include "../global.h"

std::string globalWord = "";

This is how I used it in my library

#include "../global.h"
string text = globalWord;

Thanks

like image 390
Navaneeth K N Avatar asked Feb 13 '09 02:02

Navaneeth K N


4 Answers

Don't use global variables. Just don't. Much better, if you HAVE to have globally accessible data, is to use a global function which will return globalWord, like this:

std::string globalWord()
{
    static std::string word("Hi Mom");
    return word;
}

This saves you from initialization order issues (read Effective C++ item #4).

like image 166
Matt Avatar answered Oct 09 '22 03:10

Matt


With the "extern" keyword, you're telling the compiler that the actual variable exists somewhere else. You should also create a variable with the same name without the extern, in one and only one place. Ordinarily you'll get an error from the linker if you define two of them, but if one's in the library and one's not it might not figure it out.

Edit: make sure global.cpp is only in the library or test program, not both.

like image 25
Mark Ransom Avatar answered Oct 09 '22 01:10

Mark Ransom


The problem is likely to be one of initialization order. When the program is linked, there are 2 places where globalWord is used in initialization:

  1. in the initialization of text ("string text = globalWord;")
  2. the initialization of globalWord itself

Unfortunately, the C++ standard does not specify the order of initialization of globals that come from different modules. Something similar to Matt's answer of using a function or a simple class (a singleton, for example) to access the global value is the usual way of enforcing a particular initialization order.

The C++ FAQ talks about this a little - if you plan to modify globalWord in your program, the situation is made a little more complex than they discuss because they don't seem to address setting the value hidden behind the "construct on first use" function. Typically something like that would require something like a singleton class.

like image 23
Michael Burr Avatar answered Oct 09 '22 02:10

Michael Burr


The kind of behavior you describe seems more like a problem when you have a DLL, but you are saying that your library is static, which looks weird.

Anyway, take care with global variables in multiple libraries, if you have a shared code library (DLL) you'll get a value for each part. Check out this question, can be useful.

like image 30
Edwin Jarvis Avatar answered Oct 09 '22 02:10

Edwin Jarvis