typedef的最新理解

說是新解,其實一點都不新,只是我之前沒有學會typedef的真正用法.函數

可是我感受應該有些同窗沒有掌握typedef的用法,因此寫出來分享一下.spa

 

 

1.typedef的常規用法指針

typedef unsigned int  UNIT;基礎

UINT b;變量

須要注意的地方有下面幾點:方法

define 前面替代後面, typedef後面替代前面,這個不要記混了.分享

②typedef 後面有"分號",宏定義沒有.語言

UINT是unsigned int類型的別名.co

 

 

2.使用typedef簡化複雜的定義結構體

這是一個簡單的函數指針的定義:
int (*pFun1)(int);    //在後面加上" = &fun"能夠實現初始化, 其中&無關緊要
假如再定義多個相同類型的函數指針,還能夠:
int (*pFun2)(int);
int (*pFun3)(int);
...
那麼這也太麻煩了,假如使用typedef,就能夠:
typedef int (*pFun)(int);
pFun pFun1;
pFun pFun2, pFun3;
方便了不少!

使用typedef簡化複雜的定義的本質,就是:

"用定義好的變量(pFun就是定義好的函數指針變量),表明變量的類型(函數指針類型),來定義相同類型的變量(pFun1,pFun2...)".

 

這裏補充一下函數指針的調用方式:

我覺得是: (*pFun1)(10);

其實直接使用: pFun1(10)也是能夠的!

由於函數名和函數指針,在調用和賦值的時候是不加區分的,既然函數名能夠賦值給函數指針,

調用的時候,通常使用函數名,那麼咱們使用函數指針應該也是能夠調用的!

咱們甚至能夠無聊的定義函數: void fun(int a);

而後調用的時候把fun當成指針: (*fun)(19);

 

 

3.兩種用法

我之前只知道第一種用法,看kernel代碼的時候發現有不少定義看不懂.

好比出現了定義: pFun pfun1;

我會認爲在C/C++中,自定義的類型只有結構體和類,因此pFun必定是結構體了.

可是根據使用方法,pfun1倒是函數指針的用法?因此就會很懵逼.

如今明白了,原來能夠經過typedef定義一種任何一種變量類型,包括基礎變量類型沒法直接定義的函數指針.

C語言中實現相似多態性的功能,不少都是經過函數指針來實現的,因此typedef簡化複雜的函數指針定義在kernel中很常見!

 

這兩種方法有什麼區別?

回過頭來看第一種用法,其本質未嘗不是"用定義好的變量,表明變量的類型,來定義相同類型的變量"?

咱們常見:

typedef unsigned int  UNIT;

UINT b;

好像就是給unsigned int取了一個別名.

其實這種寫法一直以來都給咱們一種誤解,這不是沒法體現typedef的本質.

假如咱們寫成:

typedef unsigned int  a;  

不看typedef,就是定義了一個變量a, typedef的做用,就是讓變量a具備"表明變量類型去定義相同類型變量"的功能!

而後纔有: a  b;

具體a定義的是什麼類型,是由"假設沒有typedef時, a做爲變量時的類型"決定的.

 

這樣一來,typedef的兩種用法的本質都是同樣的, 能夠歸納爲一種用法.

代價就是推翻了之前的理解,不過之前的理解原本就是片面的!

 

歡迎討論和補充~

相關文章
相關標籤/搜索