*關於typedef之前使用過,但一直沒有深入研究,趁著這個時候換平台研究下,所與c語言相關的內容沒有完全吃透的東西再重新( ̄~ ̄) 嚼一嚼。那就開始吧。
typedef關鍵字可以用於給資料型別定義乙個別名,比如說dl/t645-2007通訊協議,大家叫的時候都覺得名字在長了,所以注給他取了個別名645-07,所以只要大家說這個就知道是在講dl/t645-2007了。
當你定義了乙個結構體時,每次建立乙個結構體都要使用struct+結構體名的方式,而用了typedef之後,只要乙個結構體別名就可以建立了。
struct sttaskparam //本名
sttaskparam;
struct sttaskparam taskparam; //必須使用struct
typedef struct //本名可以省略
sttaskparam; //結構體別名
sttaskparam sttask1param[con_max_tasknum]; //不使用struct
並且有了別名,本名我都可以不要了(當然你也可以加上)。
雖然說簡化寫法是乙個不錯的功能,但卻不是乙個很必要的功能。那麼肯定有別的好處才是。
我們知道c語言定義資料型別的時候只定義了它們之間的關係,但卻沒有具體定義它們的大小。比如 short 的長度只規定了不大於 int,long的長度不小於 int,int是多大也沒確定,所以你會看到51微控制器的int大小為兩個位元組,而在stm32中的長度為 4 位元組。所以這個時候有必要使用乙個別名來代替具體的資料型別,並且最好這個別名有一定的說明性,所以你會看到stm32庫函式有這麼一堆申明:
/* exact-width signed integer types */
typedef signed char int8_t;
typedef signed short int int16_t;
typedef signed int int32_t;
typedef signed __int64 int64_t;
/* exact-width unsigned integer types */
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned __int64 uint64_t;
這樣一旦後期換了平台,我就知道怎麼根據新平台修改這個定義了,因為這個別名已經有長度、符號資訊了。
從51過來的讀者可能會說,幹嘛要用 typedef,使用 #define (關於#define可以檢視#define小節)也能有相同的效果。確實是,但是 #define 嚴格來說它只是用來替換的,而typedef 是專業的。所以使用 #define 可能一不小心就會給你挖坑了。
#define puchar unsigned char * //puchar被替換的是,之前的部分
puchar pstr1,pstr1; //pstr1是指標,pstr2不是指標
比如上面的,雖然本意是定義兩個指標的,但是 #define 比較笨,只會簡單替換,所以替換後成了這個樣子:
unsigned char * pstr1,pstr1; //pstr1是指標,pstr2不是指標
所以只有乙個被定義成了指標,而如果使用 typedef 就沒有這個問題。
typedef unsigned char * puchar ; //puchar是別名,
puchar pstr1,pstr1; //pstr1,pstr2都是指標
雖說typedef在取別名上是專業的,但是如果你不熟悉而貿然使用的話也可能會為你挖坑的。下面介紹使用typedef時的一些坑:
##1、const
在和const一起使用的時候,本想定義乙個指向的字元為常量的變數指標,但因為typedef的特殊性,不是簡單的替換,所以最終的定義的是指向的字元為變數的常量指標。
typedef char * ppchar; //定義字元指標的別名
int str(const ppchar, const ppchar);
/*想定義 指標為變數,指向的字元為常量的 引數
實際上是 指標為常量,指向的字元為變數*/
解決的辦法就是在typedef中加const即可:
typedef const char * ppchar; //定義字元指標的別名
int str(ppchar, ppchar); //指標為常量,指向的字元為變數
怎麼看哪個可以變,哪個不可以變呢?
就看const修飾哪乙個了。如果說const離char近,就是字元不變,如果const離指標名比較近,那就是指標不變,其他類似的,好好理解一下就差不多了。如果實在不理解也沒關係,忘記了再回來查一下就行,但是你得知道使用typedef有這麼乙個坑在就行了。
##2、儲存類
typedef 不影響物件的儲存特性,但是在語法上它卻是乙個儲存類的關鍵字,就像 auto、extern、static、register等關鍵字一樣。所以不能和儲存類的關鍵字一起使用:
typedef extern char* ppchar1;
typedef static char* ppchar2;
typedef auto char* ppchar3;
typedef register char* ppchar4;
錯誤的原因就是不能宣告多個儲存類關鍵字,typedef 已經申明了儲存屬性,不允許再有第二個了。這個坑還是不容易跳進去的,畢竟編譯器能幫你找出問題來,不用你擔心。 c語言之使用typedef定義型別
可以用typedef宣告新的型別名來代替已有的型別名。例項1 include include typedef struct student intmain 例項2 include include typedef int num 100 int main printf d n sizeof num s...
C語言之typedef詳解
typedef可以看作type define的縮寫,顧名思義就是型別定義,也就是說它只是給已有的型別重新定義了乙個方便使用的別名,並沒有產生新的資料型別。typedef的使用與巨集定義define有些許的相似,但兩者又有以下不同 1.與 define不同,typedef給出的符號名稱僅限於對型別,而...
C語言之typedef詳解
typedef可以看作type define的縮寫,顧名思義就是型別定義,也就是說它只是給已有的型別重新定義了乙個方便使用的別名,並沒有產生新的資料型別。typedef的使用與巨集定義define有些許的相似,但兩者又有以下不同 1.與 define不同,typedef給出的符號名稱僅限於對型別,而...