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。如果您不想这样做,您可以为变量编写相同的声明(
您必须使用全局范围吗?在这种情况下,您可以这样做:
在
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> |
这种方法不漂亮,而且很老套,但是它会起作用。注意只定义一次