【问题标题】:How to declare and use global external variable across multiple source files?如何跨多个源文件声明和使用全局外部变量?
【发布时间】:2015-04-02 13:15:26
【问题描述】:

我想要一个可以随时随地轻松访问的全局变量(对象)。问题是我的源代码有多个 *.hpp *.cpp 文件共享同一个变量!我在这里搜索并发现了类似的问题,但不知何故他们并没有解决我的问题。

  • 使用关键字extern存在未定义的引用错误
  • 没有关键字extern有多个定义错误
  • 关键字extern并在所有 *.cpp文件中重新声明 *.cpp文件没有关键字extern有多个定义错误
  • 使用关键字extern并在只有一个 *.cpp文件中重新声明没有关键字extern,变量只能正常工作在那个 *.cpp 文件中

GameStateManager.hpp

/// GLOBAL VARIABLES
extern sf::RenderWindow window;
extern sf::Event         event;

/// GAME STATES
#include "LogoState.hpp"

class GameStateManager
{
    ...blah blah blah...
};

GameStateManager.cpp

GameStateManager::GameStateManager()
{
    window.create(sf::VideoMode(WIDTH, HEIGHT), TITLE, FLAGS);
    window.setFramerateLimit(FPS);
    gamestatescontainer.emplace_back(new LogoState);
}

LogoState.cpp

ListOfGameStates LogoState::run()
{
    while (window.isOpen())
    {
        window.waitEvent(event);
        if (event.type == sf::Event::Closed) window.close();
    }
    return ListOfGameStates::STATE_EXIT;
}

请帮帮我!

【问题讨论】:

    标签: c++ global-variables extern


    【解决方案1】:

    通过声明变量extern,你告诉编译器最终会存在这样一个名称和类型的变量,但你不希望他定义它,所以他只声明变量。

    因此,您还需要在某处定义变量(不带 extern 关键字),我建议在 GameStateManager.cpp 中这样做,因为它们是在 GameStateManager.hpp 中声明的。

    编辑:有了这个,您还需要在 LogoState.cpp 中包含 GameStateManager.hpp。如果您不想这样做,您可以为变量编写相同的声明(extern sf::RenderWindow window;extern sf::Event event;,如果您最终在某个地方实例化它们,它也应该可以正常工作。

    【讨论】:

    • 更简单的解决方案是创建一个主标题“GlobalStuff.hpp”,正如 Andre 所说的
    【解决方案2】:

    使用全局作用域吗?在这种情况下,您可以这样做:

    <Common.h>

    #ifndef GLOBAL_DEFINED_HERE
    extern
    #endif
    int myGlobal;
    

    在一个 cpp 文件中,<SomeFile.cpp> 这样做:

    #define GLOBAL_DEFINED_HERE 1
    #include  <Common.h>
    

    其他任何地方都可以这样做

    #include  <Common.h>
    

    这种方法并不漂亮而且很老套,但它会奏效。注意只定义一次GLOBAL_DEFINED_HERE。或者,为什么没有一个带有静态成员变量的类呢?甚至单身人士,如果那是你的一杯茶?

    【讨论】:

    • 这看起来比the other answer 更简单,但它可以让您前往“shoot yourself in the foot”。 @MariusMacijauskas您是否尝试过以这种方式定义多个变量?并在多个头文件中定义它们?较大的项目可能包含多个库,因此为全局变量维护一个位置会很痛苦。
    • 当然你可以用这个射自己的脚!在现代 C++ 中,确实没有必要声明全局变量——可以使用静态变量/函数,如果这是人们想要的……最好也避免使用这些,如果可能的话
    猜你喜欢
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    相关资源
    最近更新 更多