高品質的C代碼.關于枚舉類型的使用.2011.07.01
未經許可,不的轉載
版權歸屬高雷個人
聯系方式:
qq:38929568
本系列BLOG僅在以下3個位址釋出
<a href="http://kome2000.blog.51cto.com/">http://kome2000.blog.51cto.com/</a>
<a href="http://38929568.qzone.qq.com/">http://38929568.qzone.qq.com/</a>
<a href="http://blog.csdn.net/kome2000">http://blog.csdn.net/kome2000</a>
有人認為枚舉類型 enum 就是 int類型,是以很少使用enum而用int,其實enum很有用。
1.1 變量定義
enum //跟第一個定義不同的是,此處的标号DAY省略,這是允許的。
{
sunday,
monday,
tuesday,
wednesday,
thursday,
friday,
saturday
} Workday; //變量workday的類型為枚舉型enum DAY
首先枚舉是一組常量,那麼他就有很多變量的特點,比如記憶體中隻有1份,很友善調試代碼等等,
其次他在定義時可以不必寫他的值,這樣對于一些不關心值的情況下就很友善了,比如一組遊戲中的狀态,或者連續的日期,
最後他是自然分塊的代碼,閱讀起來很清爽!
推薦使用如下形式定義enum類型資料
typedef enum Workday
} Workday;
這麼做的好處是,以後使用時,用Workday就好了!
1.2 枚舉型的應用
C語言中把枚舉資料按整型資料處理,是以在任何整形資料可以出現的地方,都可以直接使用枚舉變量,這其實會引起混亂,
我們使用枚舉類型都是用來起到辨別作用,或者把一個數字起一個有意義的名字,比如0的意義就是sunday,這樣代碼中
就可以用sunday來表示某種情況了!
是以使用枚舉減少為代碼而編碼的情況。
在函數的參數中使用枚舉類型的好處
假設我們有一個函數,如下,
work(int day)
switch( day )
{
case 0:
{
//禮拜天要做什麼事情
break;
}
case 1:
//禮拜一要做什麼事情
...
case 6:
//禮拜六要做什麼事情
default:
break;
}
}
處理一周,每天都要做什麼事情的函數,形參是用來描述哪一天的,在方法内部處理編号為0到6的情況,
像這樣的函數,會有很多不利的因素,比如 形參int day 是啥意思?取值範圍是什麼?使用者很難知道該
傳什麼樣的資料等,内部代碼也有問題,在其他人閱讀代碼的時候會問0代表什麼,1代表什麼,為什麼隻有6,等
如果我們改寫一下這段代碼,如下
} Workday;
work(Workday day)
case sunday:
case monday:
case saturday:
這樣就一目了然了,使用者隻要要傳入一個Workday類型的資料,當他不知道Workday類型是什麼的時候,會很快找到
typedef enum Workday{...};這段代碼,然後就知道要傳入的資料僅限
sunday, monday, tuesday, wednesday, thursday, friday, saturday
這7個,如果有另外的人員看這段代碼的時候也很容明白代碼的意思,假設我們代碼中少寫了禮拜四這一天的處理,
會很快被發現,如果用4表示禮拜四的話,閱讀代碼的人就很難發現或者根本不知道case 4:的這種情況應該有,還是不應該有!
根據IDE的不同,函數work(Workday day)的實參的檢查是不同的,比如我用的VC6.0 的時候
work(-1); work(123);都是允許的,而work( Workday.monday );卻提示失敗
隻能用 work( monday );
聽說VS2010就必須使用work( Workday.monday );這種形式,當然這是最理想的,因為他防止了實參的錯誤,也給閱讀代碼,
或者代碼檢查帶來了極大的便利,
雖然我的VC6做不到這點,但起碼在使用函數的時候我是知道要傳入Workday類型的值了!
這樣就可以減少我在寫代碼的時候出錯的幾率了!
PS: 為代碼而編碼
比如要做一周的事情安排
switch( day )
case 0:
//禮拜天要做什麼事情
case 1:
//禮拜一要做什麼事情
...
case 6:
//禮拜六要做什麼事情
default:
break;
這段代碼就是用0來表示禮拜天,也就為禮拜天而編了個碼,這個碼就是0
本文轉自 kome2000 51CTO部落格,原文連結:http://blog.51cto.com/kome2000/600692