深入理解typedef

2021-06-29 08:43:53 字數 3378 閱讀 3186

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 將int32定...