主要記錄學習程式設計的經驗和個人知識點總結,僅供學習用途。
提示:以下是本篇文章正文內容,主要講 enum(列舉)和 typedef。
列舉是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是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類似,但是有以下不同:
typedef char * pStr1;
#define pStr2 char *;
pStr1 s1,s2;
pStr2 s3,s4;
上述變數中,s1,s2,s3會被定義為char *,而s4則定義成了char,不是預期的指標變數,原因在於#define只是簡單的字串替換,而typedef是為一個型別起新名字。
參考資料: