typedef在C語言中的用法

typedef工具是一個高級數據特性,利用typedef可以爲某一類型自定義名稱。它與#define有3個不同點:

(1)與#define不同,typedef創建的符號名只受限於類型,不能用於值。

(2)typedef由編譯器解釋,不是預處理器。

(3)在其受限範圍內,typedef比#define更靈活。

工作原理

使用typedef時要記住,typedef並沒有創建任何新類型,它只是爲某個已存在的類型增加一個方便使用的標籤。

 

示例:假設要用BYTE表示1字節的數組。

typedef unsigned char BYTE;

隨後就可以用BYTE來定義變量:

BYTE X,Y[10],*Z;

上面一行代碼就相當於

unsigned char X,Y[10],*Z;

可見,typedef相當於給一個已有的類型起了一個新的名字,然後可以像使用舊類型名一樣使用新的類型名來聲明變量。這是否多此一舉呢?其實不是。

首先,合理使用typedef可以增加程序的可讀性,前面的示例中用BYTE代替unsigned char表明你打算用BYTE類型的變量表示數字,而不是字符碼。

其次,typedef可以提高程序的可移植性。我們知道sizeof運算符的返回值是size_t類型,time()函數返回的類型:time_t類型。這是一個無符號數,但它不是一個新類型。這就用到了C語言的typedef機制,允許程序員爲現有類型創建別名。C頭文件系統使用typedef把size_t作爲unsigned int或unsigned long的別名。這樣,使用size_t類型時,編譯器會根據不同的系統替換標準類型。對於time_t類似,只要包含time.h頭文件,程序就能訪問合適的定義。

#define的比較

typdef的一些特性與define的功能重合。例如

typdef的一些特性與define的功能重合。例如

#define BYTE unsigned char

這是預處理器用BYTE替換unsigned char。

但也有#define沒有的功能,例如:

typedef char * STRING;

編譯器把STRING解釋爲一個類型的表示符,該類型指向char。因此

STRING name, sign;

相當於

char * name , * sign;   

但是,如果這樣假設:

#define STRING char *

然後,下面的聲明:

STRING name, sign;

將被翻譯成:

char * name, sign;

這導致name纔是指針。

發揮typedef的好處

除了剛纔上面提到的可讀性和可移植性的好處外,在一些場合還可以發揮typedef的更多好處。

使用typedef的第一個原因:爲經常出現的類型創建一個方便、易識別的類型名。

例如,typedef用來命名一個結構類型,可以省略結構的標籤:

typedef struct {double x; double y;} rect;

那麼可以這樣使用rect類型名:

rect r1={3.0, 6.0};
rect r2;

以上代碼被翻譯成

struct {double x; double y;} r1={3.0, 6.0};
struct {double x; double y;} r2; 

使用typedef的第二個原因是:typedef常用於給複雜的類型命名。例如,下面的聲明:

typedef char (* FRPTC()) [5];

把FRPTC聲明爲一個函數類型,該函數返回一個指針,該指針內含5個char類型元素的數組。

使用typedef時要記住,typedef並沒有創建任何新類型,它只是爲某個已存在的類型增加一個方便使用的標籤。

通過結構、聯合和typedef,C提供了有效處理數據的工具和處理可移植數據的工具。

轉自:https://blog.csdn.net/libing403/article/details/73402411

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章