typedef 這個關鍵字用於給乙個型別起個新的名字,和define不同, typedef 給出的符號名稱僅限於對型別 , 而不是對值。下面是乙個例子:
typedef short wchar;
typedef將short型別定義成wchar型別,那麼以後遇到 wchar a; 其實就是 short a; 如果沒有typedef這個關鍵字,wchar就是乙個變數名,加上typedef,wchar就成了型別名。型別名也遵循識別符號的命名規則,並且通常加個 _t 字尾,表示type。
這樣做有什麼用處呢?僅僅從short這種基本型別是看不出來好處的,typedef的強大之處在於重定義復合型別,給復合型別乙個新的名字,以後就可以直接使用新名字來宣告變數,而不必寫一堆長長的復合型別。當然,某些情況下,也需要對基本型別重新命名,比如平台移植之類的。
下面分幾種情況描述typedef的用法。
1、指標
考慮這麼乙個宣告:
typedef char * string;
那麼string就是乙個指標型別,它指向char型別。於是,
string a,b;
就定義了兩個指標變數,它們都指向char型別的變數。相當於:
char *a, *b;
2、陣列
typedef int array[5];
array就是一種新型別,它代表有5個int型別數值的陣列,array new; 就相當於 int new[5];
這個形式理解起來有點費力,可以採用上面的方法:如果沒有typedef,那麼array就是乙個普通的陣列名;有了typedef , array就成了乙個型別名。
3、結構體
結構是typedef的主要戰場,因為一般結構體實在太長了,只有重新命名才能簡化**。比如下面這個:
struct sth;
然後,宣告變數時雖然可以這樣: struct sth one, two; 但是每次都要寫乙個struct仍然比較煩。好的辦法是這樣:
typedef struct sth;
然後就可以直接 sth one, two; 了。
4、函式
你沒看錯,typedef甚至可以定義函式型別!!如下:
typedef int func(double var);
這樣就定義了乙個函式型別func,以後就可以用func來定義變數。這條語句的理解同上面,先去掉typedef,再加上typedef,看func的含義變化。
比如下面的語句定義了乙個func型變數:
func a;
但是這個變數不能被賦值,因為這條語句相當於做了乙個宣告:
int a(double var);
然而這也是定義func型別的初衷,定義func型別是為了方便定義指向此類函式的指標,如下:
func *a;
這樣就定義了乙個函式指標a,它只能指向func型別的函式,所謂func型別的函式是指:返回值為int,而引數只有乙個double。也就是說,判斷乙個函式是不是func型的,只需要檢查它的返回值型別,引數個數及型別,而不管具體的實現。
比如下面實現了兩個func型函式:
int func1(double var1)
return (int)var1;
int func2(double var2)
return 0;
那麼我們可以令a = &func1; 也可以 a = &func2;
這裡需要**一下函式名到底意味著什麼?實際上,函式名同陣列名一樣,是乙個位址。陣列名代表著陣列首元素的位址,函式名代表著函式第一條指令的位址。
既然函式名就是位址,我們當然也可以這樣賦值:a = func1; 這同陣列名是一樣的,但是這種賦值暗含了型別轉換,func1是func函式型別(的變數?),而&func1則是函式指標型別(的變數?),只是做右值時自動型別轉換罷了。
賦值時候才可以直接使用函式指標,如:
a(2.6);
相當於呼叫func1(2.6);(如果a = func1)
以上就是typedef的一些主要用法。
C語言入門學習筆記之typedef簡介
在微控制器和作業系統中 typedef 會經常用到,它可以為某乙個型別自定義名稱。和 define比較類似。但是又有不同的地方。下面使用typedef定義乙個資料型別 int main 使用typedef將unsigned char型別重新定義為byte型別,然後在使用新的型別byte定義乙個變數c...
C語言系列文章之typedef
typedef 應該算是很熟悉的關鍵字了,但是我也只是簡單使用罷了,為了比較系統的講述這一小節,特地上網搜了一下。好了,現在正式開始講解。typedef 關鍵字可以用於給資料型別定義乙個別名,比如說你本名叫關谷神奇,我嫌棄這個名字太長了,所以給你取乙個別名,叫關谷,以後我叫關谷的時候你就知道在叫你了...
C語言筆記 define與typedef的區別
define是預處理指令,在編譯時不進行任何檢查,只進行簡單的替換 巨集定義的一般形式為 define 巨集名 字串這裡所說的字串是一般意義上的字串行,不要和c語言中的字串等同,它不需要雙引號。typedef是在c語言中用來為複雜的宣告定義簡單的別名,它本身是一種儲存類的關鍵字,與auto exte...