天天看點

高品質的C代碼.關于枚舉類型的使用.2011.07.01

高品質的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

繼續閱讀