1. 程式人生 > >class型別重定義問題

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

一般情況下,我們都是把函式宣告、類定義、模板定義等寫到一個頭檔案裡,需要時將相應的標頭檔案用#include包含到原始檔(*.cpp檔案)裡來。但標頭檔案中又允許包含其它的標頭檔案,這樣就難免發生某個標頭檔案被重複地包含。我們可以使用編譯預處理命令避免這種情況的發生。
例如,你想確保標頭檔案max.h不會被重複包含,則你可以採取如下的形式:

這裡寫圖片描述
第一條預處理命令是說,如果MAXMIN_H不為真,說明此檔案沒被包含過,此命令後面的原始碼有效(相當於:‘如果大門沒關,請您進來’);

第二條預處理命令把MAXMIN_H置為真(相當於請您把門鎖插上,不讓第二個人進來)。

最後一條預處理命令是為了標出接受上述處理的源程式的範圍(相當於您已經走到了後門)。

【#program once VS #ifndef…】

查了些資料,似乎還有別的解決方法。
使用 #pragma once

看下兩者的對比:
-#ifndef的方式受C/C++語言標準支援。它不光可以保證同一個檔案不會被包含多次,也能保證內容完全相同的兩個檔案(或者程式碼片段)不會被不小心同時包含。當然要保證巨集名不重複(論命名的重要性)。
-由於編譯器每次都需要開啟標頭檔案才能判定是否有重複定義,因此在編譯大型專案時,ifndef會使得編譯時間相對較長,因此一些編譯器逐漸開始支援#pragma once的方式。

-#pragma once一般由編譯器提供保證:同一個檔案不會被包含多次。注意這裡所說的“同一個檔案”是指物理上的一個檔案,而不是指內容相同的兩個檔案。你無法對一個頭檔案中的一段程式碼作pragma once宣告,而只能針對檔案。
-其好處是,你不必再費勁想個巨集名了,當然也就不會出現巨集名碰撞引發的奇怪問題。大型專案的編譯速度也因此提高了一些。
-對應的缺點就是如果某個標頭檔案有多份拷貝,本方法不能保證他們不被重複包含。當然,相比巨集名碰撞引發的“找不到宣告”的問題,這種重複包含很容易被發現並修正。

有問題還請大家指正

相關推薦

class型別定義問題

【問題的發生與解決】 問題: –在使用cocos2d-x編寫一個小遊戲的時候發生了 error:class型別重定義,後來發現是標頭檔案重複包含的問題。 解決方法: –防止標頭檔案重複載入,使用巨集定義防止重複。 也就是 #ifndef... #

C++中的型別定義

這幾天工作時碰到一個C++的編譯錯誤(我使用的是Visual C++ 7.0),說是有一個類重複定義,仔細想想我們的這個專案也是做了好幾個Release了,內部程式碼應該不會有這樣的低階錯誤,真把型別給重複定義了,檢查結果正如我預料的一樣。就這樣,我左右沒找到原因,被一個編譯錯誤給卡在那裡了。(在

C++型別定義錯誤的解決方法

當我們想在.h宣告中定義成員變數,有時會報型別重定義錯誤,如果不是工程中真的重複定義了多個同名類,那麼多半是沒有給該類的標頭檔案加條件指示符#ifndef,條件指示符#ifndef 最主要的目的就是防止標頭檔案的重複包含和編譯,這樣才能保證標頭檔案被多個其他檔案引用時,內部

Win32 網路程式設計中fd_set型別定義問題

問題:Win32 網路程式設計中fd_set型別重定義 D:\Program    Files\Microsoft    Visual    Studio    .NET    2003\Vc7\PlatformSDK\Include\WinSock2.h(109): 

struct 結構體“定義;不同的基型別

今天遇到這麼一個問題,一個結構體編譯報錯,“重定義;不同的基型別”,這個結構體在一個頭檔案中定義,在兩個cpp檔案中包含該標頭檔案,就報這個錯誤,結構體的定義形式為:     typedefine struct strct{ int x;

fatal error LNK1169:找到一個或多個定義的符號

ava 文件中 程序 bsp 由於 nbsp .cn 引用 error 這個算是個比較基礎的問題,由於我不是C程序員,本行java,臨時拉來做的,所以有些坑還得自己走出來。 這個問題是由於,全局變量在a.h中定義,在兩個源文件a.cpp和b.cpp中引用,之後被編譯器

Oracle已有數據表建立表分區—在線定義

空間 plus name undo 之前 自動 原因 holding pl/sql 今天在做數據抽取的時候,發現有一張業務表數據量達到了5000W,所以就想將此表改為分區表。分區表的有點如下: 1、改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度

oracle 11g 將非分區表轉換為分區表在線定義

nbsp sel color declare 執行 con res dep part --操作的用戶需要有以下的權限 GRANT CONNECT, RESOURCE TO CMIGDW; GRANT EXECUTE ON DBMS_REDEFINITION TO C

關於在es6的在class類裏定義箭頭函數會報錯的問題?

val .com HR 構造 col int gpo color 表示 class App { constructor() { this.handleClick = () => { console.log(‘this

Linux學習筆記10——管道和定義

管道重定義計算機的組成有:運算器,控制器,存儲器,輸入輸出設備。於是就有了地址總線,數據總線,控制總線。事實上在機器裏面總線是復用的,一個總線三種功能。地址總線:內存尋址數據總線:傳輸數據控制總結:控制指令 寄存器:CPU暫時存儲器 程序在運行時要從輸入設備獲取指令,通過輸出設備輸出作為人機交互。那麽系統在什

類成員函數中載/重寫(覆蓋)/定義(隱藏)的區別

類成員 arch logs AI detail 重載 article html http https://blog.csdn.net/ranxiaoxu123/article/details/52291385 https://www.cnblogs.com/renyuan

Linux練習題-定義

一行 path 字母 替代 nbsp win 顯示 系統版本 一個 1、將/etc/issue文件中的內容轉換為大寫後保存至/tmp/issue.out文件中2、將當前系統登錄用戶的信息轉換為大寫後保存至/tmp/who.out文件中3、一個linux用戶給root發郵件,

變量定義

info 命令 code include ima 重定義 -o alt col 出現變量重定義的情況? 源文件與include的文件定義了同一個變量 main.c 1 #include <stdio.h> 2 #include "a.c" 3 4 int a

確定class型別

功能:確定某個型別是否是class型別。 template<typename T> class IsClassT { private: typedef char One; typedef struct { char a[2]; } Two; template<type

C++---過載、重寫(覆蓋)、定義(隱藏)

我們經常會被過載、重寫、重定義經常被我搞混,今天就專門總結區別一下。 1.過載 1.過載概念: 過載指的都是函式過載,函式過載就是函式的一種特殊情況,C++允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函式的形參列 表(引數個數、型別、順序)必須不同,常用來處理實現功能類

python----類的定義、繼承與定義

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 #!/usr/bin/env python 5 # -*- coding: utf-8 -*- 6 7 class car(): #定義一個類 8

C++ 過載、重寫(覆蓋)、定義(隱藏) 與 Java 過載、重寫(覆蓋)、隱藏的區別

C++: 一、過載(overload) 指函式名相同,但是它的引數表列個數或順序,型別不同。但是不能靠返回型別來判斷。 (1)相同的範圍(在同一個作用域中) ; (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 (5)返回值可以不同; 二、重寫(也稱為覆蓋

python 學習彙總58:class類外部定義函式(初級學習- tcy)

 類外部定義函式 2018/11/19  目錄:  1. class定義 2. 內部類 3.外部定義函式 4.高階函式與類的關係 5.物件記憶體管理 6.類作用域 7.使用輸出引數 8.類屬性 9.類特性 10.描述符 11.檢視類屬性 12.繼承 13.型別檢

laravel中的資料遷移表結構,欄位型別定義整理

laravel中的資料遷移表結構,欄位型別,定義整理 /* 表引擎 */ $table->engine = 'InnoDB'; /* 類型別 */ // - 數字 $table->bigInteger('id'); $t

【C++】定義,過載,重寫

過載 同一個作用域內,方法名相同而引數不同的幾個方法。 class AA { public: void print() { cout << "父類" << endl; } void print(int x ) {