C語言之typedef的使用

2021-10-19 21:17:09 字數 2984 閱讀 7985

*關於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給出的符號名稱僅限於對型別,而...