如何跨多个源文件声明和使用全局外部变量?
How to declare and use global external variable across multiple source files?
我想要一个可以随时随地轻松访问的全局变量(对象)。问题是我的源代码有多个共享同一个变量的 *.hpp and *.cpp 文件!我在这里搜索并发现了类似的问题,但不知何故他们没有解决我的问题。
- With关键字extern存在未定义引用错误
- 没有关键字extern有多个定义错误
- With 关键字 extern 并在 all *.cpp 文件中重新声明 *. cpp 文件没有关键字 extern 有多个定义错误
- With关键字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;
}
请帮帮我!
你有使用全局作用域吗?在这种情况下,您可以这样做:
在<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
。或者,为什么不使用带有静态成员变量的 class 呢?或者甚至单身,如果那是你的一杯茶?
通过声明变量extern,你告诉编译器最终会有这样的名称和类型的变量,但你还不想让他定义它,所以他只是声明变量。
因此,您还需要在某处定义变量(不带 extern 关键字),我建议在 GameStateManager.cpp 中进行定义,因为它们是在 GameStateManager.hpp.
中声明的
编辑:有了这个,您还需要在 LogoState.cpp 中包含 GameStateManager.hpp。如果你不想这样做,你可以为变量(extern sf::RenderWindow window;
和 extern sf::Event event;
编写相同的声明,如果你最终在某个地方实例化它们,它也应该可以正常工作。
我想要一个可以随时随地轻松访问的全局变量(对象)。问题是我的源代码有多个共享同一个变量的 *.hpp and *.cpp 文件!我在这里搜索并发现了类似的问题,但不知何故他们没有解决我的问题。
- With关键字extern存在未定义引用错误
- 没有关键字extern有多个定义错误
- With 关键字 extern 并在 all *.cpp 文件中重新声明 *. cpp 文件没有关键字 extern 有多个定义错误
- With关键字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;
}
请帮帮我!
你有使用全局作用域吗?在这种情况下,您可以这样做:
在<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
。或者,为什么不使用带有静态成员变量的 class 呢?或者甚至单身,如果那是你的一杯茶?
通过声明变量extern,你告诉编译器最终会有这样的名称和类型的变量,但你还不想让他定义它,所以他只是声明变量。
因此,您还需要在某处定义变量(不带 extern 关键字),我建议在 GameStateManager.cpp 中进行定义,因为它们是在 GameStateManager.hpp.
中声明的编辑:有了这个,您还需要在 LogoState.cpp 中包含 GameStateManager.hpp。如果你不想这样做,你可以为变量(extern sf::RenderWindow window;
和 extern sf::Event event;
编写相同的声明,如果你最终在某个地方实例化它们,它也应该可以正常工作。