您當前的位置:首頁 > 動漫

C語言“隱秘的角落”——typedef的妙用

作者:由 黃桃咬住葡萄出逃 發表于 動漫時間:2020-10-12

寫在前面:此文將摘錄C語言中容易被忽視的一些知識,並且加以思考為什麼要那麼做。

它可以存在的道理是:所有語言或多或少都有共同點,舉一反三或許可以得到的更多。

我將以tip 1,2,3 當做標識持續更新下去,感興趣的可以關注+收藏,謝謝。

PS: 雙擊螢幕可以使自己更專心哦,下面開始咯。

公眾號: 黃桃罐頭與蜘蛛 寫一寫可愛的事物。

C語言“隱秘的角落”——typedef的妙用

Tip2: typedef 的妙用

最早發現typedef的好處是在剛接觸函式指標的時候。

程式碼大概是這樣:

C語言“隱秘的角落”——typedef的妙用

C語言“隱秘的角落”——typedef的妙用

這大概是typedef定義中最難理解的樣子了。

比如:typedef關鍵字的定義是:

C語言“隱秘的角落”——typedef的妙用

牛刀小試的時候,我們一般會把它當做#define的替代品:

C語言“隱秘的角落”——typedef的妙用

這就非常容易理解,typedef用後面的標記代表了前面宣告的型別。

它與#define的宣告各有所長,且放後話。

回到上面的例子,

這裡的typedef應該這麼理解:

在原來的聲明裡逐步用別名替換一部分複雜宣告,如此迴圈,把帶變數名的部分留到最後替換,得到的就是原宣告的最簡化版。

所以可以看出來spec_show_func 是那個變數名

C語言“隱秘的角落”——typedef的妙用

順理成章我們就可以用它來宣告一種型別。

比如 : spec_show_func[10] , 陣列中每一種都是函式指標,對應的引數,和返回值型別都一致。

為什麼要這麼寫呢?正常的寫法又是什麼樣子?

C語言“隱秘的角落”——typedef的妙用

這裡的含義是:

宣告並定義一個含有10個元素的陣列,陣列中是如此型別的函式指標。

下面是對這個陣列的賦值。

看起來還行?

那麼如果我們需要兩個陣列呢?

C語言“隱秘的角落”——typedef的妙用

對,複製貼上就可以。看起來也不是很難。

那麼來看一下用typedef的程式碼吧:

C語言“隱秘的角落”——typedef的妙用

高下立判。

下面我總結了一些關於typedef的使用技巧和使用時機。

當然,還會有一些阻撓你的陷阱。

用typedef來定義與平臺無關的型別。

如上文所述:

C語言“隱秘的角落”——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用來寫一些自動化的指令碼。

可能正是人類的這些想要偷懶的思想,才讓這個社會慢慢步入現代自動化吧。

標簽: typedef  宣告  函式指標  char  define