上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
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 文章: 689
2704.11 果凍幣
|
發表於: 2007-8-17, PM 5:11 星期五 文章主題: |
|
|
define給數字一個名稱的功能我個人覺得要避免使用
除非那個名稱很長很獨特
不然常會有不可預期的錯誤發生
像我前幾天剛看到一個例子
在有這個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 檔案
來取得. |
|
回頂端 |
|
|
|