class类型重定义问题

【问题的发生与解决】
问题:
–在使用cocos2d-x编写一个小游戏的时候发生了 error:class类型重定义,后来发现是头文件重复包含的问题。

解决方法:
–防止头文件重复加载,使用宏定义防止重复。
也就是

#ifndef...
#define...
.....
#endif

实例:

#ifndef _GAME_OVER_SCENE_H_
#define _GAME_OVER_SCENE_H_

#include <cocos2d.h>
USING_NS_CC;
……
class GameOverScene : public Scene
{
public:
    static cocos2d::Scene* createScene();
};

#endif

【再回顾下头文件的包含问题】
摘自:http://blog.csdn.net/chenshuzhenteacher/article/details/8139886

一般情况下,我们都是把函数声明、类定义、模板定义等写到一个头文件里,需要时将相应的头文件用#include包含到源文件(*.cpp文件)里来。但头文件中又允许包含其它的头文件,这样就难免发生某个头文件被重复地包含。我们可以使用编译预处理命令避免这种情况的发生。
例如,你想确保头文件max.h不会被重复包含,则你可以采取如下的形式:

这里写图片描述
第一条预处理命令是说,如果MAXMIN_H不为真,说明此文件没被包含过,此命令后面的源代码有效(相当于:‘如果大门没关,请您进来’);

第二条预处理命令把MAXMIN_H置为真(相当于请您把门锁插上,不让第二个人进来)。

最后一条预处理命令是为了标出接受上述处理的源程序的范围(相当于您已经走到了后门)。


【#program once VS #ifndef…】

查了些资料,似乎还有别的解决方法。
使用 #pragma once

看下两者的对比:
-#ifndef的方式受C/C++语言标准支持。它不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。当然要保证宏名不重复(论命名的重要性)。
-由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,ifndef会使得编译时间相对较长,因此一些编译器逐渐开始支持#pragma once的方式。

-#pragma once一般由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。你无法对一个头文件中的一段代码作pragma once声明,而只能针对文件。
-其好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。大型项目的编译速度也因此提高了一些。
-对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,这种重复包含很容易被发现并修正。


有问题还请大家指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值