深入理解typedef

2021-05-23 19:22:30 字數 3488 閱讀 6481

首先請看看下面這兩句:

typedef int a[10];

typedef void (*p)(void);

如果你能一眼就看出它們的意思,那請不要再往下看了。如果你不太理解,或概念還有些模糊,請繼續往下看吧。

typedef用來宣告乙個別名,typedef後面的語法,是乙個宣告。本來這裡不會產生什麼誤解的,但結果卻出乎意料,產生誤解的人不在少數。罪魁禍首又是那些害人的教材。在這些教材中介紹typedef的時候通常會寫出如下形式:

typedef int para;

這種形式跟#define int para幾乎一樣!這些教材的宗旨是由淺入深,但實際做出來的行為卻是以偏蓋全!

的確,這種形式在所有形式中是最簡單的,但卻沒有對 typedef進一步解釋,使得不少人用#define的思維來看待typedef,把int與para分開來看,int是一部分,para是另一部分,但實際上根本就不是這麼一回事。int與para是乙個整體!就象int i:宣告一樣是乙個整體宣告,只不過int i定義了乙個變數,而typedef定義了乙個別名。

typedef int a[10];

typedef void (*p)(void);

會以為a[10]是int的別名,(*p)(void)是void的別名,但這樣的別名看起來又似乎不是合法的名字,於是陷入困惑之中。實際上,上面的語句把a宣告為具有10個int元素的陣列的型別別名,p是一種函式指標的型別別名。

雖然在功能上,typedef可以看作乙個跟int para分離的動作,但語法上typedef屬於儲存類宣告說明符,因此嚴格來說,typedef int para整個是乙個完整的宣告。

定義乙個函式指標型別。比如原函式是:

void func(void);

那麼定義的函式指標型別就是:

typedef void (*fun)(void);

然後用此型別生成乙個指向函式的指標:

fun func1;

func1(void);

下面是理解typedef的正確方法,分為以下幾步:

1. 確定被宣告的型別:遇到typedef時,從左到右進行掃瞄,找到第乙個「陌生」的標誌符,這個標誌符就應該是語句所宣告的型別名稱。例如:

typedef int* (* pt)(int* (*pn)(int * p1,int *p2),int * p3);

typedef int * (*pt)(int * (*)(int *, int *),int *);

2. 之後一旦遇到該型別宣告的變數,則在該型別的typedef式中用變數代替型別,去掉typedef關鍵字,所得到的宣告式等價與原來的宣告。例如:

pt p;

這個宣告式,可以經過兩步變化為等價的宣告式。

首先,回到pt的typedef式:

typedef int * (*pt)(int * (*)(int *, int *),int *);

用p代替pt:

typedef int * (*p)(int * (*)(int *, int *),int *);

然後把typedef去掉,得到:

int * (*p)(int * (*)(int *, int *),int *);

這個語句與 pt p;意義相同。

如果基礎紮實,應該知道,這是個函式指標的宣告,所指向的函式有兩個int * 引數,返回乙個int *值,第二個引數是int * ,整個函式返回乙個int *。

typedef和define的區別

typedef和define都可以用來給物件取乙個別名,但是兩者卻有著很大不同。

1. 首先,二者執行時間不同

關鍵字typedef在編譯階段有效,由於是在編譯階段,因此typedef有型別檢查的功能。

define則是巨集定義,發生在預處理階段,也就是編譯之前,它只進行簡單而機械的字串替換,而不進行任何檢查。

#define用法例子:

#define f(x) x*x

main( )

程式的輸出結果是: 36,根本原因就在於#define只是簡單的字串替換。

2. 功能不同

typedef用來定義型別的別名,這些型別不只包含內部型別(int,char等),還包括自定義型別(如struct),可以起到使型別易於記憶的功能。

如:    

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

定義乙個指向函式的指標的資料型別pf,其中函式返回值為int,引數為const char *。

typedef 有另外乙個重要的用途,那就是定義機器無關的型別,例如,你可以定義乙個叫 real 的浮點型別,在目標機器上它可以i獲得最高的精度:

typedef long double real;

在不支援 long double 的機器上,該 typedef 看起來會是下面這樣:

typedef double real;

並且,在連 double 都不支援的機器上,該 typedef 看起來會是這樣:

typedef float real;

#define不只是可以為型別取別名,還可以定義常量、變數、編譯開關等。

3. 作用域不同

#define沒有作用域的限制,只要是之前預定義過的巨集,在以後的程式中都可以使用。

而typedef有自己的作用域。

void fun()   

void   gun()   

4. 對指標的操作

二者修飾指標型別時,作用不同。

typedef int *pint;

#define pint int *

const pint p;//p不可更改,p指向的內容可以更改,相當於int * const p;

const pint p;

//p可以更改,p指向的內容不能更改,相當於 const int *p;或 int const *p;

pint s1, s2;//s1和s2都是int型指標

pint s3, s4;

//相當於int * s3,s4;只有乙個是指標

深入理解typedef

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

深入理解typedef

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

深入理解typedef

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