1. 程式人生 > >C語言typedef詳解

C語言typedef詳解

     在C還是C++程式碼中,typedef都使用的很多。typedef與#define有些相似,其實是不同的。

基本定義:typedef為C語言的關鍵字,作用是為一種資料型別定義一個新名字,這裡的資料型別包括基本資料型別(int,char),也包括自定義的資料型別(struct)。教科書上的解釋為:資料結構的表示(儲存結構)用型別定義(typedef)描述。資料元素型別約定為ElemType,由使用者在使用該資料型別時自行定義。

(1)與#define的區別

typedef有點像#define巨集,其實際型別替代同義字。不同點是typedef在編譯時被解釋,因此讓編譯器來應付超越前處理器能力的文字替換。

(2)減少錯誤

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

char* pa,pb;

這多數不符合我們的意圖,它只宣告一個指向字元變數的指標和一個字元變數。可以使用下面方式修改:
typedef char* pchar;
pchar pa,pb;
這種方式很有用,特別是char* pa,pb;的定義,初學者往往認為是定義了兩個字元型指標,其實不是,而用typedef char* pchar 就不會出現這個問題,減少了錯誤的發生。

(3)直觀簡潔

用在舊的C程式碼中,配合struct使用。以前的程式碼中,宣告struct新物件時,必須要帶上struct,即形式為:struct 結構體名 物件名。如:

struct tagPOINT1 {
    int x;
    int y;
};
struct tagPOINT1 p1;

如果使用typedef程式碼如下:

typedef struct tagPOINT {
    int x;
    int y;
}POINT;
POINT p1;//可以這樣;
struct tagPOINT p2;//也可以這樣;

或:
typedef struct {
    int x;
    int y;
}POINT;
POINT p1;

POINT p1;這樣就比原來的方式少寫了一個struct,比較省事,尤其在大量使用的時候。

(4)平臺無關性

用typedef來定義與平臺無關的型別。比如可以定義一個REAL的浮點型別,在目標機器上可以獲得最高的精度。

typedef long double REAL;
在不支援long double的機器上,可以修改為如下:
typedef double REAL;
如果連double都不支援,修改為如下:
typedef float REAL;

也就是說,當跨平臺時,只要改下typedef本身就行,不用對其他原始碼做任何修改。

本文參考:http://blog.csdn.net/wangqiulin123456/article/details/8284939   。