C ++包括警卫

时间:2016-12-08 02:52:51

标签: 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中声明一个变量,并在main函数中定义它。我不确定我是否不理解包含警卫,但我得到了奇怪的错误:

'irr':不是类或命名空间名称 语法错误:缺少';'在'*'之前 缺少类型说明符 - 假设为int。注意:C ++不支持default-int

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

irr::scene::ISceneManager* sceneManager;

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

最好不要在标头中声明变量。它的结尾非常频繁,因为包含标题的每个文件都会创建自己的sceneManager。当链接器出现将程序放在一起时,它可能会发现数十个sceneManager都声称是真正的sceneManager,并且厌恶地举起手来,并在整个地方喷出错误消息控制台。

在scene.h中添加

#include <irrlicht\irrlicht.h>

在顶部向上声明irrlicht的所有位和bob,以便它们在scene.h中可用。

然后改变

irr::scene::ISceneManager* sceneManager; 

extern irr::scene::ISceneManager* sceneManager; 

extern告诉编译器sceneManager存在,存储将被分配到其他地方。编译器会微笑并继续进行操作,而不会将链接中的sceneManager真正的irr::scene::ISceneManager* sceneManager; 排序。

最后,放

sceneManager
在Main.cpp中

分配存储,以便链接器有<?php if($postcount > $postsperpage): ?> <ul class="pagination pull-right"> <li <?php if($paged == 1 ){echo 'class="disabled"';} ?>><a href="<?= $siteurl ?>/category/news">First</a></li> <li <?php if($paged == 1 ){echo 'class="disabled"';} ?>><a href="<?= $siteurl ?>/category/news/page/<?= $paged - 1 ?>">Prev</a></li> <?php foreach(range(1,$pagecount) as $page): ?> <li <?php if($paged == $page ){echo 'class="active"';} ?>><a href="<?= $siteurl ?>/category/news/page/<?= $page ?>"><?= $page ?></a></li> <?php endforeach ?> <li <?php if($paged == $pagecount ){echo 'class="disabled"';} ?>><a href="<?= $siteurl ?>/category/news/page/<?= $paged + 1 ?>">Next</a></li> <li <?php if($paged == $pagecount ){echo 'class="disabled"';} ?>><a href="<?= $siteurl ?>/category/news/page/<?= $pagecount ?>">Last</a></li> </ul> <?php endif ?> 来查找。

Documentation on extern

推荐阅读:When to use extern in C++