全局变量和范围 - C ++

时间:2009-02-13 02:01:45

标签: c++ variables global-variables scope

我在制作全局变量时遇到小问题。我使用的是Visual Studio 2008和标准C ++。

我有两个项目,一个是静态库,第二个是使用该库的测试程序。我在global.h中有一个全局变量,如

#ifndef GLOBAL_H
#define GLOBAL_H

#include <string>

extern std::string globalWord;

#endif // GLOBAL_H!

我有一个global.cpp,我正在初始化这个变量。该变量在我的库项目中使用。我正在从测试项目中为此变量设置一个值,但该值未反映在库项目中。

我已调试并在测试项目中显示新值,但是当控件到达库项目时,此变量值显示为空。那么这个全局变量的范围仅限于它所属的项目吗?

或者有更好的方法吗?我不想在我的库中修改我的函数或构造函数参数来传递这个值。

任何帮助都会很棒。

编辑:

以下是在global.cpp中声明此变量的方法

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

std::string globalWord = "";

这是我在我的库中使用它的方式

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

由于

4 个答案:

答案 0 :(得分:7)

不要使用全局变量。只是不要。更好的是,如果你必须拥有全局可访问的数据,那就是使用一个全局函数来返回globalWord,如下所示:

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

这可以避免初始化顺序问题(阅读Effective C ++ item#4)。

答案 1 :(得分:5)

使用“extern”关键字,您告诉编译器实际变量存在于其他位置。您还应该在一个和只有一个的位置创建一个具有相同名称而没有extern的变量。通常情况下,如果你定义其中两个,你会从链接器中得到一个错误,但是如果一个在库中,而一个不在它可能没有弄明白。

编辑:确保global.cpp仅在库或测试程序中,而不是两者。

答案 2 :(得分:3)

问题可能是初始化顺序之一。链接程序时,有两个地方在初始化中使用globalWord

  1. text"string text = globalWord;“)
  2. 的初始化中
  3. globalWord本身的初始化
  4. 不幸的是,C ++标准没有指定来自不同模块的全局变量的初始化顺序。类似于Matt's answer使用函数或简单类(例如,单例)来访问全局值的东西是强制执行特定初始化顺序的常用方法。

    The C++ FAQ talks about this a little - 如果您打算在程序中修改globalWord,情况会比他们讨论的情况稍微复杂一些,因为他们似乎没有解决设置隐藏在“构造”背后的值在第一次使用“功能。通常类似的东西需要something like a singleton class

答案 3 :(得分:2)

当你有一个DLL时,你描述的行为似乎更像是一个问题,但是你说你的库是静态的,看起来很奇怪。

无论如何,要注意多个库中的全局变量,如果你有共享代码库(DLL),你将获得每个部分的值。查看this问题,可能很有用。