深入理解typedef

2021-06-19 01:08:00 字數 2613 閱讀 3425

typedef作為型別定義關鍵字,用於在原有資料型別(包括基本型別、構造型別和指標等)的基礎上,由使用者自定義新的型別名稱。

在程式設計中使用typedef的好處,除了為變數取乙個簡單易記且意義明確的新名稱之外,還可以簡化一些比較複雜的型別宣告。比如:

typedef int int32;

將int32定義為與int具有相同意義的名字,這樣型別int32就可用於型別宣告和型別轉換了,它和型別int完全相同。比如:              

int32      a;                            // 定義整型變數a

(int32)    b;                            // 將其它的型別b轉換為整型

既然已經有了int這個名稱,為什麼還要再取乙個名稱呢?主要是為了提高程式的可移植性。比如,某種微處理器的int為16位,long為32位。如果要將該程式移植到另一種體系結構的微處理器,假設編譯器的int為32位,long為64位,而只有short才是16位的,因此必須將程式中的int全部替換為short,long全部替換為int,如此這樣修改勢必工作量巨大且容易出錯。如果將它取乙個新的名稱,然後在程式中全部用新取的名稱,那麼要移植的工作僅僅只是修改定義這些新名稱即可。也就是說,只需要將以前的:

typedef int int16;

typedef long int32;

替換成:

typedef short int16;

typedef int int32;

由此可見,typedef宣告並沒有建立乙個新型別,而是為某個已經存在的型別增加乙個新的名字而已。用這種方式宣告的變數與通過宣告方式宣告的變數具有完全相同的屬性。

至於typedef如何簡化複雜的型別宣告,將在後續的章節中詳細闡述。

綜上所述,如果在變數定義的前面加上typedef,即可定義該變數的型別。比如:

int size;

這裡定義了乙個整型變數size,當加上typedef後:

typedef int size;

那麼,size就成為了上面的size變數的型別,即int型別。既然size是乙個型別,當然可以用它來定義另外乙個變數。即:

size a; 

類似於變數的型別定義,也可以用typedef宣告新的型別,比如:

char              *ptr_to_char;            // 宣告ptr_to_char為乙個指向字元的指標

typedef  char     ptr_to_char;             // 宣告ptr_to_char為指向char的指標型別

ptr_to_char       pch;                    // 宣告pch是乙個指向字元的指標

對於初學者來說,也許會產生乙個這樣的疑問,為什麼不使用#define建立新的型別名?比如:

#define  ptr_to_char  char*

ptr_to_char           pch1, pch2;

由於有了「#define ptr_to_char char*」,因此「ptr_to_char pch1, pch2」可以展開為

char   *pch1, pch2;

所以pch2為char型變數。如果用typedef來定義的話,其**如下:

typedef  char*   ptr_to_char;

ptr_to_char      pch1, pch2;

則「ptr_to_char pch1, pch2」等價於

char   *pch1;

char   *pch2;

因此,pch1、pch2都是指標。

雖然#define語句看起來象typedef,但實際上卻有本質上的差別。對於#define來說,僅在編譯前對源**進行了字串替換處理;而對於typedef來說,它建立了乙個新的資料型別別名。由此可見,只是將pch1定義為指標變數,卻並沒有實現程式設計師的意圖,而是將pch2定義成了char型變數。

在指標函式中,有這樣一類函式,它們也返回指標,但是這個指標不是指向int、char之類的基本型別,而是指向函式。對於初學者,別說寫出這樣的函式宣告,就是看到這樣的寫法也是一頭霧水。比如,下面的語句:

int (*ff(int))(int *, int);

我們用上面介紹的方法分析一下,ff首先與後面的「()」結合,即:

int (*(ff(int)))(int *, int);                   // 用括號將ff(int)再括起來

也就意味著,ff是乙個函式。

接著與前面的「*」結合,說明ff函式的返回值是乙個指標。然後再與後面的「()」結合,也就是說,該指標指向的是乙個函式。

這種寫法確實讓人非常難懂,以至於一些初學者產生誤解,認為寫出別人看不懂的**才能顯示自己水平高。而事實上恰好相反,能否寫出通俗易懂的**是衡量程式設計師是否優秀的標準。一般來說,用typedef關鍵字會使該宣告更簡單易懂。在前面我們已經見過:

int (*pf)(int *, int);

也就是說,pf是乙個函式指標「變數」。當使用typedef宣告後,則pf就成為了乙個函式指標「型別」,即:

typedef int (*pf)(int *, int);

這樣就定義了返回值的型別。然後,再用pf作為返回值來宣告函式:

pf ff(int);

深入理解typedef

首先請看看下面這兩句 typedef int a 10 typedef void p void 如果你能一眼就看出它們的意思,那請不要再往下看了。如果你不太理解,或概念還有些模糊,請繼續往下看吧。typedef用來宣告乙個別名,typedef後面的語法,是乙個宣告。本來這裡不會產生什麼誤解的,但結果...

深入理解typedef

深入理解typedef 關於typedef的用法,網上已經有很多前輩總結過了,在這裡我不想標新立異,閱歷不一樣,所理解的typedef的層次各有不同。這裡,我想就我所理解的typedef用更加通俗易懂的方式寫出來。在開始之前,要始終牢記 typedef的本質是取乙個別名 先從簡單的說起 這裡,typ...

深入理解typedef

typedef作為型別定義關鍵字,用於在原有資料型別 包括基本型別 構造型別和指標等 的基礎上,由使用者自定義新的型別名稱。在程式設計中使用 typedef 的好處,除了為變數取乙個簡單易記且意義明確的新名稱之外,還可以簡化一些比較複雜的型別宣告。比如 typedef int int32 將int3...