如何在多个源文件中声明和使用全局外部变量?

时间:2015-02-03 11:01:50

标签: c++ global-variables extern

我想要一个全局变量(对象),我可以随时随地轻松访问它。问题是我的源代码有多个共享相同变量的* .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;
}

拜托,帮助我!

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

<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一次。或者,为什么没有一个带有静态成员变量的类?或者甚至单身,如果这是你的一杯茶?