C語言“隱秘的角落”——typedef的妙用
寫在前面:此文將摘錄C語言中容易被忽視的一些知識,並且加以思考為什麼要那麼做。
它可以存在的道理是:所有語言或多或少都有共同點,舉一反三或許可以得到的更多。
我將以tip 1,2,3 當做標識持續更新下去,感興趣的可以關注+收藏,謝謝。
PS: 雙擊螢幕可以使自己更專心哦,下面開始咯。
公眾號: 黃桃罐頭與蜘蛛 寫一寫可愛的事物。
Tip2: typedef 的妙用
最早發現typedef的好處是在剛接觸函式指標的時候。
程式碼大概是這樣:
這大概是typedef定義中最難理解的樣子了。
比如:typedef關鍵字的定義是:
牛刀小試的時候,我們一般會把它當做#define的替代品:
這就非常容易理解,typedef用後面的標記代表了前面宣告的型別。
它與#define的宣告各有所長,且放後話。
回到上面的例子,
這裡的typedef應該這麼理解:
在原來的聲明裡逐步用別名替換一部分複雜宣告,如此迴圈,把帶變數名的部分留到最後替換,得到的就是原宣告的最簡化版。
所以可以看出來spec_show_func 是那個變數名
順理成章我們就可以用它來宣告一種型別。
比如 : spec_show_func[10] , 陣列中每一種都是函式指標,對應的引數,和返回值型別都一致。
為什麼要這麼寫呢?正常的寫法又是什麼樣子?
這裡的含義是:
宣告並定義一個含有10個元素的陣列,陣列中是如此型別的函式指標。
下面是對這個陣列的賦值。
看起來還行?
那麼如果我們需要兩個陣列呢?
對,複製貼上就可以。看起來也不是很難。
那麼來看一下用typedef的程式碼吧:
高下立判。
下面我總結了一些關於typedef的使用技巧和使用時機。
當然,還會有一些阻撓你的陷阱。
用typedef來定義與平臺無關的型別。
如上文所述:
在更多的情況下,它可以宣告一些型別可以起到隱藏資訊的目的。
陷阱1:由於typedef本身就是關鍵字,它不能夠與其他如static , const一起使用。
陷阱2: 請注意它與#define的區別,並且選擇適當的情況下使用。舉一個例子,
typedef char * p_char , 在函式中 void func ( const p_char p) 傳參const p_char
是一個指標常量,翻譯過來是char* const p, 並不是const char* p;
用來最佳化程式碼結構,使程式碼避免臃腫,增加複用性。
總的來說,就是歸類。
C語言並不是OOP語言,它一半是火焰,一半是海水。它非常的細膩,將所有的型別恨不得都給你分的很細,同時它也變得非常的嚴格,它會對你的程式碼要求很高。
我們會有很多場景下有一些相同的引數要求,可是我們不需要每次都去宣告定義它們,就像上述的函式指標一樣。
那麼使用typedef 來統一歸類是一個非常不錯的選擇。
它還會讓你的程式碼看起來更有層次。
在你想要宣告函式指標的時候,請想到它。
我非常建議你在使用函式指標的時候使用它,除非你只想在一個函式中使用。
同時:
我也希望你在宣告struct 和 union的時候使用它。
無腦使用它。
除了一種情況:
陷阱:當你使用連結串列的時候,請不要使用typedef關鍵字,因為當你宣告的結構體中含有你自身結構體的指標時,會編譯不透過。
typedef struct {
xxx ;
node
t * p_node;
} node_t ;
這樣是錯誤的,請你老老實實使用stuct node{}; 的方式去定義。至於為什麼,可以參考這篇文章中chapter 4。
思考:
其實typedef 這個關鍵字起的很妙: type define。 基本就很直白的告訴了我們它可以為我們做到什麼。
我在學習python的時候,python號稱萬物皆物件,而class其實又何嘗不是type define,只不過它在實現型別的宣告之外,還可以對它的操作加入了方法,方法+變數已經形成了一種定式。
C語言是非常底層的語言,可是它隨著標準的革新,也一步步得被賦予了新的使命,其實就我個人的理解,這都是程式設計師們想要“偷懶”的結果。
正是是因為想要偷懶,所以才拋棄那些繁複的重疊,一步步進步了起來。
而我也是為了偷懶,才學習python用來寫一些自動化的指令碼。
可能正是人類的這些想要偷懶的思想,才讓這個社會慢慢步入現代自動化吧。