enum 和 typedef 知識點總結

2020-10-29 10:00:01


前言

主要記錄學習程式設計的經驗和個人知識點總結,僅供學習用途。


提示:以下是本篇文章正文內容,主要講 enum(列舉)和 typedef。

一、enum(列舉)

列舉是C語言中的一種基本資料型別,它可以讓資料更簡潔,更易讀。
列舉語法定義格式為:

enum 列舉名
{
   列舉元素1,
   列舉元素2...
}列舉變數;

列舉名是自定義的一種資料資料型別名,而列舉變數為列舉名型別的一個變數,叫做列舉變數

列舉變數是對一個變數取值範圍的限定,而花括號內是它的取值範圍,列舉名型別的變數也就是列舉變數,它智慧取值為花括號內的任何一個值,如果賦給列舉變數的值不在上述{ }列表內,則會報錯或者警告。列舉元素也是列舉常數,常數一般為大寫

比如一週有7天,如果不用列舉,採用#define為整數定義如下:

#define MON 1
#define YUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7

採用列舉的方式實現同樣的功能:

enum DAY
{
   MON=1,TUE,WED,THU,FRI,SAT,SUN
};

enum DAY yesterday;
enum DAY today;
enum DAY tomorrow;//變數tomorrow的型別為列舉型enum DAY

注意:第一個列舉元預設值為整型的0,後續列舉元的值在前一個成員基礎上加1,如果第一個列舉元值定義為1,第二個就為2,以此類推。

二、typedef

typedef是C語言提供的關鍵字,可以使用它來為型別取一個新的名字。
例如:

typedef unsigned char BYTE;

在這個型別定義之後,識別符號BYTE可以作為型別unsigned char的縮寫,比如:

BYTE b1,b2;

按照慣例,定義時採用大寫字母,提醒使用者型別名稱是一個象徵性的縮寫。

用途一:
定義一個型別的別名,而不是簡單的宏替換。可以用作同時宣告指標型的多個物件。
比如:

char * pa,pb; //只宣告了一個指向字元變數的指標和一個字元變數


//以下可行
typedef char *PCHAR; //一般為大寫
PCHAR pa,pb;   //可行,同時宣告了兩個只想字元變數的指標。

//雖然
char *pa,*pb;
//也可行,但是相對來說沒有用typedef的形式直觀,尤其在需要大量指標的地方,typedef的方式更省事。

用途2
用typedef關鍵字把列舉或者結構體定義成別名,並利用該別名進行變數宣告:

typedef enum Workday1
{
    saturday,
    sunday,
    monday,
    tuesday,
    wednesday,
    thursday,
    friday
}workday;   //此處的workday為列舉型 enum Workday1的別名

workday today,tomorrow;//變數today和tomorrow的型別為列舉型別workday,也就是enum Workday1
   typedef struct tagPOINT
   {
       int x;
       int y;       
   }POINT;
   POINT p1;

//沒有typedef的話,只能使用如下定義
struct tagPOINT1 p1;

用途3
用 typedef 定義與平臺無關的型別。
比如定義一個叫REAL的浮點型別,在目標平臺上,讓它表示最高精度的型別:

typedef long double REAL;

在不支援long double的平臺2上,改為:

typedef double REAL;

在不支援double的平臺3上,改為:

typedef float REAL;

當程式跨平臺時,只要改typedef本身就好了,不需要對別的原始碼做修改,可以在寫程式碼時減少不必要的修改工作

用途4
為複雜的宣告定義一個新的簡單別名。

總結

總結:#define是C指令,用於為各種資料型別定義別名,與typedef類似,但是有以下不同:

  1. typedef僅限於為型別定義符號名稱,#define不僅可以為型別定義別名,也能為數值定義別名。
  2. typedef是由編譯器執行解釋的,#define是由預編譯器進行處理的。
  3. typedef一般情況下比**#define**要好,特別是在有指標的場合下,例如:
typedef char * pStr1;
#define pStr2 char *;
pStr1 s1,s2;
pStr2 s3,s4;

上述變數中,s1,s2,s3會被定義為char *,而s4則定義成了char,不是預期的指標變數,原因在於#define只是簡單的字串替換,而typedef是為一個型別起新名字。


參考資料:

  1. RUNOOB enum
  2. RUNOOB typedef
  3. BigCoder typedef
  4. liitdar typedef
  5. 哈哈呵h
  6. 目盼兮
  7. 一句話幫你理解typedef的用法
  8. C typedef 4種用法小結