C語言入門學(xué)習(xí)筆記之typedef簡(jiǎn)介
在單片機(jī)和操作系統(tǒng)中 typedef 會(huì)經(jīng)常用到,它可以為某一個(gè)類型自定義名稱。和#define比較類似。但是又有不同的地方。
- typedef 創(chuàng)建的符號(hào)只能用于數(shù)據(jù)類型,不能用于值。而#define 創(chuàng)建的符號(hào)可以用于值。
- typedef 是由編譯器來解釋,而不是預(yù)處理器。
- typedef 使用起來更加靈活。
下面使用typedef定義一個(gè)數(shù)據(jù)類型
int main() { typedef unsigned char BYTE; BYTE c = 10; printf("%d \r\n",c); system("pause"); return 0; }
使用typedef將unsigned char類型重新定義為BYTE類型,然后在使用新的類型BYTE定義一個(gè)變量c。輸出結(jié)果如下:
此時(shí)如果使用 #define 來替換,好像也可以。
這里使用 #define 將unsigned char替換為 BYTE好像也正確。
下面在看一個(gè)例子。
int main() { typedef char * STR; STR s1,s2; s1="abc"; s2="123"; printf("%s %s \r\n",s1,s2); system("pause"); return 0; }
將字符指針 char * 重新定義為STR類型,然后使用STR定義兩個(gè)指針s1和s2,這樣s1和s2都是指向字符的指針。接著給這兩個(gè)指針賦值,然后打印出來。
這時(shí)使用 #define 來替換 typedef 的功能。
#define STR char * int main() { STR s1,s2; s1="abc"; s2="123"; printf("%s %s \r\n",s1,s2); system("pause"); return 0; }
這時(shí)候編譯程序的時(shí)候,程序會(huì)報(bào)錯(cuò)。
這時(shí)為什么呢?因?yàn)槭褂胻ypedef的時(shí)候,是定義了一個(gè)新的數(shù)據(jù)類型。
typedef char * STR; STR s1,s2;
相當(dāng)于
char *s1, *s2; s1="abc"; s2="123";
s1和s2都是指向字符類型的指針。
如果使用 #define 的時(shí)候,系統(tǒng)只是簡(jiǎn)單的替換。
#define STR char * STR s1,s2;
將STR用 char * 進(jìn)行替換
char *s1,s2; s1="abc"; s2="123";
替換后只有s1是指針,s2依然是一個(gè)char類型的變量。所以給s2賦值一個(gè)字符串的時(shí)候系統(tǒng)就會(huì)報(bào)錯(cuò)。因此要重新定義一個(gè)數(shù)據(jù)類型的時(shí)候,要使用typedef,這個(gè)在定義結(jié)構(gòu)體的時(shí)候使用的非常多。
typedef struct Date { int year; int month; int day; } DT;
使用typedef 將結(jié)構(gòu)體 struct Date 重新定義為DT類型,這樣在使用DT定義變量的時(shí)候,就相當(dāng)于使用了 struct Date 來定義變量。
typedef struct Date { int year; int month; int day; } DT; DT d1 = {2021,10,1}; DT d2 = {2021,10,10};
等價(jià)于
struct Date { int year; int month; int day; }; struct Date d1 = {2021,10,1}; struct Date d2 = {2021,10,10};
這樣通過使用 typedef 來重新定義一個(gè)新的類型,使代碼寫起來更加的簡(jiǎn)潔。這種方法在單片機(jī)的庫函數(shù)中使用的最多。
typedef struct { uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; }GPIO_InitTypeDef; void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //LED0-->PA8 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); /PD2 輸出高 }
通過 typedef 將結(jié)構(gòu)體重定義為GPIO_InitTypeDef 類型,這樣在初始化的時(shí)候,直接使用GPIO_InitTypeDef 類型就可以定義一個(gè)關(guān)于GPIO的結(jié)構(gòu)體。
在定義數(shù)據(jù)類型的時(shí)候,也會(huì)用到 typedef 重新定義一個(gè)數(shù)據(jù)類型。
通過tepedef 定義新的數(shù)據(jù)類型,增加了代碼的可讀性和移植性。這里說的新的數(shù)據(jù)類型不是創(chuàng)建了一個(gè)系統(tǒng)不存在的數(shù)據(jù)類型,而是給已經(jīng)存在的某個(gè)類型增加了一個(gè)方便使用的標(biāo)簽。而這個(gè)標(biāo)簽又不同于 #define 只是簡(jiǎn)單的符號(hào)替換。
總結(jié)
到此這篇關(guān)于C語言入門學(xué)習(xí)筆記之typedef簡(jiǎn)介的文章就介紹到這了,更多相關(guān)C語言typedef簡(jiǎn)介內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談C++內(nèi)存分配及變長(zhǎng)數(shù)組的動(dòng)態(tài)分配
下面小編就為大家?guī)硪黄獪\談C++內(nèi)存分配及變長(zhǎng)數(shù)組的動(dòng)態(tài)分配。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09C++實(shí)現(xiàn)LeetCode(107.二叉樹層序遍歷之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(107.二叉樹層序遍歷之二),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Qt圖片繪圖類之QPixmap/QImage/QPicture詳解
這篇文章主要為大家詳細(xì)介紹了Qt圖片繪圖類中QPixmap、QImage和QPicture的使用方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03rapidjson解析json代碼實(shí)例以及常見的json core dump問題
今天小編就為大家分享一篇關(guān)于rapidjson解析json代碼實(shí)例以及常見的json core dump問題,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04在C/C++與Python之間實(shí)現(xiàn)通信的常見方法
在C/C++與Python之間實(shí)現(xiàn)通信的方式有很多,本文給大家介紹了一些常見的方法,文中通過代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-12-12C語言數(shù)據(jù)結(jié)構(gòu)中約瑟夫環(huán)問題探究
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)中約瑟夫環(huán)問題,總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路2023-01-01