C++ 包括警卫



我知道这个问题被问了很多次,但似乎没有答案可以解决这个问题。

我有两个文件。

主.cpp

#include <irrlichtirrlicht.h>
#include <vector>
#include <string> 
#include <iostream>
#include "Scene.h"
#include "Camera.h"
#include "Gui.h"
irr::IrrlichtDevice* device;
irr::video::IVideoDriver* driver;
int main() {
device = irr::createDevice(irr::video::EDT_SOFTWARE, irr::core::dimension2d<irr::u32>(640, 480), 16, false, false, false, 0);
if (!device)
return 1;
device->setWindowCaption(L"NeoTrap");
driver = device->getVideoDriver();
sceneManager = device->getSceneManager();
GUIEnvironment = device->getGUIEnvironment();
//Testing
Mesh* ground = new Mesh();
//Testing
while (device->run()) {
driver->beginScene(true, true, irr::video::SColor(255, 120, 102, 136));
sceneManager->drawAll();
GUIEnvironment->drawAll();
driver->endScene();
}
device->drop();
return 0;
}

场景.h

#ifndef _SCENE_HEADER_
#define _SCENE_HEADER_
irr::scene::ISceneManager* sceneManager; 
struct Mesh {
public:
Mesh();
private:
};
class Scene {
public:
Scene();
private:
};
#endif

我正在尝试做的是在 Scene.h 中声明一个变量并从 main 函数中定义它。我不确定我是否不明白包括警卫,但我遇到了奇怪的错误:

"irr":不是类或命名空间名称 语法错误:"*"之前缺少";" 缺少类型说明符 - 假定为 int。注意:C++不支持默认整数

但是当我将以下行移回 Main.cpp 文件中时

irr::scene::ISceneManager* sceneManager;

程序编译。什么时候我无法在 scene.h 中声明它并从主函数设置值?

最好不要在标头中声明变量。它的结局往往很糟糕,因为每个包含标题的文件都会做出自己的sceneManager。当链接器出现将程序放在一起时,它可能会发现数十个sceneManager都同样声称自己是真正的sceneManager,厌恶地举起双手,并在控制台上喷洒错误消息。

在场景中添加

#include <irrlichtirrlicht.h>

在顶部声明所有 irrlicht 的零碎和小块,以便它们在 Scene.h 中可用。

然后更改

irr::scene::ISceneManager* sceneManager; 

extern irr::scene::ISceneManager* sceneManager; 

extern告诉编译器sceneManager存在,存储将分配到其他地方。编译器微笑着继续前进,将整理一个真正的sceneManager在哪里留给链接器。

最后,把

irr::scene::ISceneManager* sceneManager; 

.cpp分配存储,以便链接器具有要查找sceneManager

有关extern的文档

推荐阅读:何时在C++中使用 extern

您声明sceneManager的类型为irr::scene::ISceneManager*,但在声明该变量时不存在irr命名空间。在声明变量之前,将include添加到声明该命名空间的头文件。

之后,您需要在标头中声明要externsceneManager,以便包含该标头的每个编译单元不会创建自己的变量实例。然后因为它是extern的,你还需要在main.cpp中重新声明它(不带extern)。

相关内容

  • 没有找到相关文章

最新更新