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

How to declare and use global external variable across multiple source files?

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

  • 关键字extern存在未定义的引用错误
  • 如果没有关键字extern,则存在多个定义错误
  • 在所有*.cpp文件中使用关键字extern并重新声明*.cpp文件而不使用关键字extern时,存在多个定义错误。
  • 在一个没有关键字extern的*.cpp文件中使用关键字extern并重新声明,变量仅在该*.cpp文件中工作正常。

游戏状态管理器.hpp

1
2
3
4
5
6
7
8
9
10
11
/// GLOBAL VARIABLES
extern sf::RenderWindow window;
extern sf::Event         event;

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

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

GameStateManager.cpp游戏状态管理器

1
2
3
4
5
6
GameStateManager::GameStateManager()
{
    window.create(sf::VideoMode(WIDTH, HEIGHT), TITLE, FLAGS);
    window.setFramerateLimit(FPS);
    gamestatescontainer.emplace_back(new LogoState);
}

Logo STATE.CPP

1
2
3
4
5
6
7
8
9
ListOfGameStates LogoState::run()
{
    while (window.isOpen())
    {
        window.waitEvent(event);
        if (event.type == sf::Event::Closed) window.close();
    }
    return ListOfGameStates::STATE_EXIT;
}

求你了,帮帮我!


通过声明变量extern,您可以告诉编译器,最终将存在具有此类名称和类型的此类变量,但您不希望他定义它,所以他只是声明了该变量。

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

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


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

1
2
3
4
#ifndef GLOBAL_DEFINED_HERE
extern
#endif
int myGlobal;

在一个cpp文件中,执行以下操作:

1
2
#define GLOBAL_DEFINED_HERE 1
#include  <Common.h>

其他任何地方都可以

1
#include  <Common.h>

这种方法不漂亮,而且很老套,但是它会起作用。注意只定义一次GLOBAL_DEFINED_HERE。或者,为什么没有一个带有静态成员变量的类?或者是单身汉,如果那是你的茶?