class類型重定義問題

【問題的發生與解決】
問題:
–在使用cocos2d-x編寫一個小遊戲的時候發生了 error:class類型重定義,後來發現是頭文件重複包含的問題。web

解決方法:
–防止頭文件重複加載,使用宏定義防止重複。
也就是svg

#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/8139886spa

通常狀況下,咱們都是把函數聲明、類定義、模板定義等寫到一個頭文件裏,須要時將相應的頭文件用#include包含到源文件(*.cpp文件)裏來。但頭文件中又容許包含其它的頭文件,這樣就不免發生某個頭文件被重複地包含。咱們可使用編譯預處理命令避免這種狀況的發生。
例如,你想確保頭文件max.h不會被重複包含,則你能夠採起以下的形式:.net

這裏寫圖片描述
第一條預處理命令是說,若是MAXMIN_H不爲真,說明此文件沒被包含過,此命令後面的源代碼有效(至關於:‘若是大門沒關,請您進來’);code

第二條預處理命令把MAXMIN_H置爲真(至關於請您把門鎖插上,不讓第二我的進來)。xml

最後一條預處理命令是爲了標出接受上述處理的源程序的範圍(至關於您已經走到了後門)。blog


【#program once VS #ifndef…】遊戲

查了些資料,彷佛還有別的解決方法。
使用 #pragma once圖片

看下二者的對比:
-#ifndef的方式受C/C++語言標準支持。它不光能夠保證同一個文件不會被包含屢次,也能保證內容徹底相同的兩個文件(或者代碼片斷)不會被不當心同時包含。固然要保證宏名不重複(論命名的重要性)。
-因爲編譯器每次都須要打開頭文件才能斷定是否有重複定義,所以在編譯大型項目時,ifndef會使得編譯時間相對較長,所以一些編譯器逐漸開始支持#pragma once的方式。

-#pragma once通常由編譯器提供保證:同一個文件不會被包含屢次。注意這裏所說的「同一個文件」是指物理上的一個文件,而不是指內容相同的兩個文件。你沒法對一個頭文件中的一段代碼做pragma once聲明,而只能針對文件。
-其好處是,你沒必要再費勁想個宏名了,固然也就不會出現宏名碰撞引起的奇怪問題。大型項目的編譯速度也所以提升了一些。
-對應的缺點就是若是某個頭文件有多份拷貝,本方法不能保證他們不被重複包含。固然,相比宏名碰撞引起的「找不到聲明」的問題,這種重複包含很容易被發現並修正。


有問題還請你們指正