第14章 结构和其他数据形式 14.12 typedef 简介
2019獨角獸企業重金招聘Python工程師標準>>>
typedef工具是一種高級數據特性,它使您能夠為某一類型創建您自己的名字。在這方面,它和#define相似,但是它們有3個不同之處:
1、與#define不同,typedef給出的符號名稱僅限于對類型,而不是對值 。
2、typedef的解釋由編譯器,而不是預處理器執行。
3、雖然它的范圍有限,但在其受限范圍內,typedef比#define更靈活。
假設要對1字節的數值使用術語BYTE,您只須像定義一個char變量那樣定義BYTE,然后在這個定義前面加上關鍵字typedef,如:
typedef unsigned char BYTE;
隨后,您就可以使用BYTE來定義變量了:
BYTE x,y[10], *z;
該定義的作用域取決于typedef語句所在的位置,如果定義在一個函數內部,它的作用域限定在那個函數里,如果定義在函數外部,它將具有全局作用域。
通常,這些定義使用大寫字母,以提醒這個類型名稱實際上是一個符號縮寫。
管理變量名的同樣規則也用來管理typedef使用的名字。
在前面的例子中,使用BYTE來代替unsigned char有助于說明您打算用BYTE變量來表示數值而非字符編碼。使用typedef也有助于增加可移植性。例如,我們已經提到過表示sizeof運算符返回類型的size_t類型,以及表示函數time()的返回值類型的time_t類型。C標準規定sizeof和time()應返回整數類型,但它留給具體的實現來決定到底是哪種整數類型。不進行指定的原因是ANSI C委員會覺得沒有一個對所有計算機平臺來說都是最好的選擇。因此,他們提出一個新類型名稱,如,time_t,讓C實現使用typedef來把這個名稱設定為某種特定的數據類型。這樣,他們可以提供以下通用原型:
time_t time(time_t *);
在一個系統上,time_t可能是unsigned int類型;在另一個系統上,它可能是unsigned long類型。只要包含了time.h頭文件,程序就可以訪問適當的定義,您也可以在代碼中聲明time_t變量。
使用#define可以實現typedef的一部分功能,例如:
#define BYTE unsigned char
這使預處理器用unsigned char來代替BYTE。但也有#define實現不了的功能,如下例所示:
typedef char * STRING;
如果沒有關鍵字typedef,該例將STRING識別為一個char指針,有了這個關鍵字,使STRING成為char指針 的標識符。因此:
STRING name,sign;
意思是:
char *name,*sign;
但是假設這樣做:
#define STRING char*
那么:
STRING name,sign;
將會被翻譯成下面的形式:
char *name,sign;
在這種情況下,只有name是一個指針。
也可以對結構使用typedef:
typedef struct complex{float real;float imag; }COMPLEX;這樣您就可以使用COMPLEX代替struct complex來表示復數。使用typedef的一個原因是為經常出現的類型創建一個方便的、可識別的名稱。
使用typedef來命名一個結構類型時,可以省去結構的標記:
typedef struct {double x;double y;} rect ;
假設像下面這樣使用typedef定義的類型名:
rect r1={3.0,6.0};
rect r2;
r2=r1;
將被翻譯成:
struct {double x;doubley;} r1={3.0,6.0};
struct {double x;double y;} r2;
r2=r1;
如果兩個結構的聲明都不使用標記,但是使用相同的成員(成員名和類型都匹配),那么C認為這兩個結構具有同樣的類型,因此將r1賦給r2是一個正確的操作。
使用typedef的另一個原因是,typedef名稱經常被用于復雜的類型。例如:
typedef char (*FRPTC())[5];
這把FRPTC聲明為一個函數類型,該類型的函數返回一個指向含有5個元素的char數組的指針。
當使用typedef時,要記住它不是創建新的類型,它只是創建了便于使用的標簽 。這意味著,例如,我們創建的STRING類型的變量可以作為參數傳遞給需要char指針類型參數的函數 。
通過結構、聯合和typedef,C提供了有效和方便地處理數據的工具。
轉載于:https://my.oschina.net/idreamo/blog/868051
總結
以上是生活随笔為你收集整理的第14章 结构和其他数据形式 14.12 typedef 简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多台服务器通过ssh 无密钥直接登陆主机
- 下一篇: 查看Oracle耗时Sql