5

我在制作全局变量时遇到了小问题。我正在使用 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

4 回答 4

8

不要使用全局变量。只是不要。更好的是,如果您必须拥有全局可访问的数据,则使用将返回 globalWord 的全局函数,如下所示:

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

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

于 2009-02-13T02:13:22.207 回答
6

使用“extern”关键字,您是在告诉编译器实际变量存在于其他地方。您还应该在一个且只有一个地方创建一个没有外部变量的同名变量。通常,如果定义其中两个,链接器会出现错误,但如果一个在库中,一个不在库中,则可能无法识别。

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

于 2009-02-13T02:11:17.580 回答
3

问题很可能是初始化顺序之一。程序链接时,初始化有2个地方globalWord用到:

  1. text( "string text = globalWord;")的初始化中
  2. globalWord自身的初始化

不幸的是,C++ 标准没有指定来自不同模块的全局变量的初始化顺序。类似于Matt 的使用函数或简单类(例如单例)来访问全局值的答案是强制执行特定初始化顺序的常用方法。

C++ 常见问题解答对此进行了一些讨论-如果您打算globalWord在程序中进行修改,情况会比他们讨论的要复杂一些,因为它们似乎没有解决设置隐藏在“首次使用时构造”功能后面的值的问题. 通常这样的事情需要像单例类这样的东西

于 2009-02-13T02:27:36.650 回答
2

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

无论如何,请注意多个库中的全局变量,如果您有一个共享代码库 (DLL),您将获得每个部分的值。看看这个问题,可能会有用。

于 2009-02-13T02:32:25.360 回答