C++ 包含守卫
C++ Include guards
我知道这个问题被问过很多次,但似乎没有答案可以解决这个问题。
我有两个文件。
Main.cpp
#include <irrlicht\irrlicht.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;
}
Scene.h
#ifndef _SCENE_HEADER_
#define _SCENE_HEADER_
irr::scene::ISceneManager* sceneManager;
struct Mesh {
public:
Mesh();
private:
};
class Scene {
public:
Scene();
private:
};
#endif
我想做的是在 Scene.h 中声明一个变量并在主函数中定义它。我不确定我是否不明白 include guards,但我收到了奇怪的错误:
'irr': 不是 class 或命名空间名称
语法错误:缺少“;”前 '*'
缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int
但是当我将以下行移回 Main.cpp 文件时
irr::scene::ISceneManager* sceneManager;
程序编译。我什么时候不能在 scene.h 中声明它并从 main 函数中设置值?
您正在声明 sceneManager
是 irr::scene::ISceneManager*
类型,但是当您声明该变量时 irr
命名空间不存在。在声明变量之前,将 include
添加到声明该命名空间的 header 文件。
之后,您需要在 header 中声明 sceneManager
为 extern
,这样每个包含 header 的编译单元都不会创建它自己的变量实例。然后因为它是 extern
,你还想在 main.cpp.
中重新声明它(没有 extern
)
最好不要在header中声明变量。它经常以糟糕的方式结束,因为每个包含 header 的文件都会成为它们自己的 sceneManager
。当链接器开始将程序放在一起时,它可能会发现数十个 sceneManager
都声称自己是真正的 sceneManager
,厌恶地举起手来,并在整个程序中喷洒错误消息控制台。
在scene.h中添加
#include <irrlicht\irrlicht.h>
在顶部声明 irrlicht 的所有细节,以便它们在 scene.h.
中可用
然后改变
irr::scene::ISceneManager* sceneManager;
到
extern irr::scene::ISceneManager* sceneManager;
extern
告诉编译器 sceneManager
存在并且存储将分配到其他地方。编译器微笑着继续,留下真正的 sceneManager
到链接器的地方。
最后,放
irr::scene::ISceneManager* sceneManager;
在 Main.cpp 中分配存储空间,以便链接器可以找到 sceneManager
。
我知道这个问题被问过很多次,但似乎没有答案可以解决这个问题。
我有两个文件。
Main.cpp
#include <irrlicht\irrlicht.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;
}
Scene.h
#ifndef _SCENE_HEADER_
#define _SCENE_HEADER_
irr::scene::ISceneManager* sceneManager;
struct Mesh {
public:
Mesh();
private:
};
class Scene {
public:
Scene();
private:
};
#endif
我想做的是在 Scene.h 中声明一个变量并在主函数中定义它。我不确定我是否不明白 include guards,但我收到了奇怪的错误:
'irr': 不是 class 或命名空间名称 语法错误:缺少“;”前 '*' 缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int
但是当我将以下行移回 Main.cpp 文件时
irr::scene::ISceneManager* sceneManager;
程序编译。我什么时候不能在 scene.h 中声明它并从 main 函数中设置值?
您正在声明 sceneManager
是 irr::scene::ISceneManager*
类型,但是当您声明该变量时 irr
命名空间不存在。在声明变量之前,将 include
添加到声明该命名空间的 header 文件。
之后,您需要在 header 中声明 sceneManager
为 extern
,这样每个包含 header 的编译单元都不会创建它自己的变量实例。然后因为它是 extern
,你还想在 main.cpp.
extern
)
最好不要在header中声明变量。它经常以糟糕的方式结束,因为每个包含 header 的文件都会成为它们自己的 sceneManager
。当链接器开始将程序放在一起时,它可能会发现数十个 sceneManager
都声称自己是真正的 sceneManager
,厌恶地举起手来,并在整个程序中喷洒错误消息控制台。
在scene.h中添加
#include <irrlicht\irrlicht.h>
在顶部声明 irrlicht 的所有细节,以便它们在 scene.h.
中可用然后改变
irr::scene::ISceneManager* sceneManager;
到
extern irr::scene::ISceneManager* sceneManager;
extern
告诉编译器 sceneManager
存在并且存储将分配到其他地方。编译器微笑着继续,留下真正的 sceneManager
到链接器的地方。
最后,放
irr::scene::ISceneManager* sceneManager;
在 Main.cpp 中分配存储空间,以便链接器可以找到 sceneManager
。