代码之家  ›  专栏  ›  技术社区  ›  Navaneeth K N

全局变量和范围-C++

  •  4
  • Navaneeth K N  · 技术社区  · 16 年前

    我在使全局变量起作用方面遇到了小问题。我使用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 回复  |  直到 16 年前
        1
  •  7
  •   Matt    16 年前

    不要使用全局变量。不要这样做。更好的方法是,如果必须拥有全局可访问的数据,那么使用一个全局函数,它将返回globalword,如下所示:

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

    这样可以节省初始化次序问题(读取有效C++项目4)。

        2
  •  5
  •   Mark Ransom    16 年前

    使用“extern”关键字,您将告诉编译器实际变量存在于其他地方。您还应该在一个和中创建一个没有外部变量的同名变量。 只有一个 地点。通常,如果你定义了其中两个,你会从链接器中得到一个错误,但是如果一个在库中,而另一个不在库中,那么它可能无法解决这个问题。

    编辑:确保global.cpp只在库或测试程序中,而不是同时在库或测试程序中。

        3
  •  3
  •   Community CDub    8 年前

    问题可能是初始化顺序之一。当程序链接时,有两个位置 globalWord 用于初始化:

    1. 在初始化时 text ( "string text = globalWord; “”
    2. 的初始化 全局字 它本身

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

    The C++ FAQ talks about this a little -如果你打算修改 全局字 在您的程序中,情况比他们讨论的要复杂一些,因为他们似乎没有解决设置“第一次使用时构造”函数背后隐藏的值的问题。通常需要 something like a singleton class .

        4
  •  2
  •   Community CDub    8 年前

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

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