電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
[c++]define與enum的差別

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式初級班:語法及基礎概念
上一篇主題 :: 下一篇主題  
發表人 內容
lsk
喜歡上這裡的冒險者


註冊時間: 2007-06-20
文章: 93

20.59 果凍幣

發表發表於: 2007-8-17, AM 2:55 星期五    文章主題: [c++]define與enum的差別 引言回覆

Define與enum都有給數字一個名稱的功能,像是:

代碼:
#define JANUARY 1

enum
{
   JANUARY = 1,
};


然後在程式裡我們用JANUARY都會得到1的值。不過有時我很納悶,有一大堆數字要定義的時候,用enum當然是方便又好看多了;但是只有一兩個值的時候,用enum會不會有點太僅慎了?用define會不會讓程式碼產生出來的object file小一點呢?

所以我今天去google了一下。enum還是有很多好處的:

1. enum有scope的概念,可以是全域的,也可以只存在一個class裡,比define好控制;define的有效範圍則是從你定義它的地方到那一整個檔案的尾端。

2. Debuger會認得enum而不認得define. 你可以在你的watch window看到enum的值,但是看不到define的。光這點就應該用enum了。

3. enum支援type checking,也就是compiler知道enum到底是個float還是int。

而我所說的只有一兩個值的情況,有人建議可以用const代替... 不過這不就一樣會增加程式大小嗎?有人知道compiler如何實作enum嗎?
回頂端
檢視會員個人資料 發送私人訊息
happylin
略有貢獻的成員


註冊時間: 2007-07-26
文章: 70

127.34 果凍幣

發表發表於: 2007-8-17, AM 9:26 星期五    文章主題: Re: [c++]define與enum的差別 引言回覆

lsk 寫到:
Define與enum都有給數字一個名稱的功能,像是:

代碼:
#define JANUARY 1

enum
{
   JANUARY = 1,
};


然後在程式裡我們用JANUARY都會得到1的值。不過有時我很納悶,有一大堆數字要定義的時候,用enum當然是方便又好看多了;但是只有一兩個值的時候,用enum會不會有點太僅慎了?用define會不會讓程式碼產生出來的object file小一點呢?

所以我今天去google了一下。enum還是有很多好處的:

1. enum有scope的概念,可以是全域的,也可以只存在一個class裡,比define好控制;define的有效範圍則是從你定義它的地方到那一整個檔案的尾端。

2. Debuger會認得enum而不認得define. 你可以在你的watch window看到enum的值,但是看不到define的。光這點就應該用enum了。

3. enum支援type checking,也就是compiler知道enum到底是個float還是int。

而我所說的只有一兩個值的情況,有人建議可以用const代替... 不過這不就一樣會增加程式大小嗎?有人知道compiler如何實作enum嗎?


#define 是macro 替代. 也就是說
如果妳寫了 #define aa 100+20
在程式中某個地方用了 aa 他就會替代成 100+20
就好比把100+20 copy 到aa 的位置
但是這會發生一些問題. 如這個例子

aa*9 會替代成 100+20*9 並不是 120*9 結果不是妳要的

使用 enum 不會有這樣的問題.

不過enum 也有使用上的限制
他只能真對整數型態使用. 你查到的東西第3點有說錯. float 型態不能設定到enum
寫enum {
xx = 3.1 //<== 會compiler 不過
};

google 中查到的. 說的那些. 除了第三點有誤外. 使用enum 確實是比#define 還要優的選擇.
另用#define 不一定會省空間. 大部份的情況下程式都會變大.
回頂端
檢視會員個人資料 發送私人訊息
lsk
喜歡上這裡的冒險者


註冊時間: 2007-06-20
文章: 93

20.59 果凍幣

發表發表於: 2007-8-17, PM 12:40 星期五    文章主題: 引言回覆

哈哈,感謝指正。其實我原本的意思是你用define不管是定義一個float還是int,bebug的時候都是看不到的啦~~ 忘了反過來,enum並不能用float的。
回頂端
檢視會員個人資料 發送私人訊息
yag
Site Admin


註冊時間: 2007-05-02
文章: 688

2673.35 果凍幣

發表發表於: 2007-8-17, PM 5:11 星期五    文章主題: 引言回覆

define給數字一個名稱的功能我個人覺得要避免使用
除非那個名稱很長很獨特
不然常會有不可預期的錯誤發生
像我前幾天剛看到一個例子
代碼:
#define len 24

在有這個define的程式中
會變成無法呼叫strlen函式或者使用length屬性
因為在link之前,strlen就變成了str24,而length也變成了24gth
也就造成了找不到函式或屬性的情況

至於大小問題...如果只有幾個變數實在差不到哪去
現在的記憶體跟硬碟都很大
大部份時候
我們會寧願犧牲一些容量來顧及程式碼的維護性

註:我所謂的維護性是指較不容易出錯以及較容易除錯。
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
happylin
略有貢獻的成員


註冊時間: 2007-07-26
文章: 70

127.34 果凍幣

發表發表於: 2007-8-21, PM 4:16 星期二    文章主題: 引言回覆

yag 寫到:

因為在link之前,strlen就變成了str24,而length也變成了24gth
也就造成了找不到函式或屬性的情況



在link 前就變了.. 事實上是在compile 前就變了
一個.c 檔要變成一個obj 檔要的動作
text edit 編出一個 .c 檔
.c -> 前置處理器(就是巨集替處理替代) -> C compiler -> 沒錯誤 -> 產生.obj 檔

所以 前置處理是最早被執行的(前置處理就是那些# 開頭的指令)
前置處理後. 在給compiler 是處理過# 開頭指另過的檔案

數個.c 檔產生.obj 檔在搭上lib 後在透過linker 才會產生 .exe 的可執行檔

至於要怎麼得到前置處理器 處理過的檔案.
在VC++ 可在console(command line mode) 下使用CL /E 檔案
linux 上的gun C/C++ , windows 下的MinGW 可用CPP 檔案
來取得.
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式初級班:語法及基礎概念 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作