C語言系列文章之typedef

2021-09-11 17:38:08 字數 2521 閱讀 8223

typedef 應該算是很熟悉的關鍵字了,但是我也只是簡單使用罷了,為了比較系統的講述這一小節,特地上網搜了一下。

好了,現在正式開始講解。

typedef 關鍵字可以用於給資料型別定義乙個別名,比如說你本名叫關谷神奇,我嫌棄這個名字太長了,所以給你取乙個別名,叫關谷,以後我叫關谷的時候你就知道在叫你了。

當你定義了乙個結構體時,每次建立乙個結構體都要使用 struct + 結構體名 的方式,而用了 typedef 之後,只要乙個結構體別名就可以建立了。

並且有了別名,本名我都可以不要了(當然你也可以加上)。

雖然說簡化寫法是乙個不錯的功能,但卻不是乙個很必要的功能。那麼肯定有別的好處才是。

我們知道 c 語言定義資料型別的時候只定義了它們之間的關係,但卻沒有具體定義它們的大小。比如 short 的長度只規定了不大於 int,long 的長度不小於 int,int 是多大也沒確定,所以你會看到 51 微控制器的 int 大小為兩個位元組,而在 stm32 中的長度為 4 位元組。所以這個時候有必要使用乙個別名來代替具體的資料型別,並且最好這個別名有一定的說明性,所以你會看到 stm32 庫函式有這麼一堆申明:

這樣一旦後期換了平台,我就知道怎麼根據新平台修改這個定義了,因為這個別名已經有長度、符號資訊了。

從 51 過來的讀者可能會說,幹嘛要用 typedef,使用 #define (關於 #define 可以檢視 #define 小節)也能有相同的效果。確實是,但是 #define 嚴格來說它只是用來替換的,而 typedef 是專業的。所以使用 #define 可能一不小心就會給你挖坑了。

比如上面的,雖然本意是定義兩個指標的,但是 #define 比較笨,只會簡單替換,所以替換後成了這個樣子:

所以只有乙個被定義成了指標,而如果使用 typedef 就沒有這個問題。

並且可以多次使用 typedef 定義乙個別名,方便理解。

這個宣告還是比較難理解的,看起來像乙個函式,實際上,它是乙個陣列,這個陣列存放了 3 個函式指標,而這個函式返回值為 long*,引數為 int*、char*,這是因為 fun 首先和 結合,所以先是乙個陣列,然後才定義了陣列存放的資料型別。

如果使用多次定義的話就容易理解一些了:

這樣一來就簡化了資料型別的定義和宣告了。所以在看別人的**的時候你會發現很多這樣的宣告,這是因為確實很方便啊。

雖說 typedef 在取別名上是專業的,但是如果你不熟悉而貿然使用的話也可能會為你挖坑的。下面介紹使用 typedef 時的一些坑:

1、 const

在和 const 一起使用的時候,本想定義乙個指向的字元為常量的變數指標,但 typedef 的特殊性,不是簡單的替換,所以最終的定義的是指向的字元為變數的常量指標。

解決的辦法就是在 typedef 中加 const 即可:

這樣就沒有問題了。

看到這裡可能對以下寫法可能會模糊了:

怎麼看哪個可以變,哪個不可以變呢?

就看 const 修飾哪乙個了。如果說 const 離 char 近,就是字元不變,如果 const 離指標名比較近,那就是指標不變,其他類似的,好好理解一下就差不多了。如果實在不理解也沒關係,忘記了再回來查一下就行,但是你得知道使用 typedef 有這麼乙個坑在就行了。

2、 儲存類

typedef 不影響物件的儲存特性,但是在語法上它卻是乙個儲存類的關鍵字,就像 auto、extern、static、register 等關鍵字一樣。所以不能和儲存類的關鍵字一起使用:

錯誤的原因就是不能宣告多個儲存類關鍵字, typedef 已經申明了儲存屬性,不允許再有第二個了。這個坑還是不容易跳進去的,畢竟編譯器能幫你找出問題來,不用你擔心。

C語言系列文章之enum

列舉,顧名思義,就是把乙個個可能的值列舉出來,它們占用的空間是同乙個。這個功能和 define 有些相似,但又不完全一樣,define 是專業替換戶,列舉可能的值只是它的其中一種運用方式罷了 關於 define,可以檢視 define 小節 怎麼理解呢?就比如乙個玻璃瓶,你規定只能用它裝水 飲料 酒...

C語言筆記之typedef

typedef 這個關鍵字用於給乙個型別起個新的名字,和define不同,typedef 給出的符號名稱僅限於對型別 而不是對值。下面是乙個例子 typedef short wchar typedef將short型別定義成wchar型別,那麼以後遇到 wchar a 其實就是 short a 如果沒...

C語言學習系列 typedef用法

typedef工具是乙個高階的資料特性,利用拖油瓶edef可以為某一型別自定義名稱。這方面和 define類似,但是兩者有3處不同 與 define不同,typedef建立的符號名,只受限於型別,不能用於值。typedef由編譯器解釋,不是預處理器。在其受限範圍內,typedef比 define更靈...