說是新解,其實一點都不新,只是我之前沒有學會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的兩種用法的本質都是同樣的, 能夠歸納爲一種用法.
代價就是推翻了之前的理解,不過之前的理解原本就是片面的!
歡迎討論和補充~