C語言入門學(xué)習(xí)筆記之typedef簡介
在單片機和操作系統(tǒng)中 typedef 會經(jīng)常用到,它可以為某一個類型自定義名稱。和#define比較類似。但是又有不同的地方。
- typedef 創(chuàng)建的符號只能用于數(shù)據(jù)類型,不能用于值。而#define 創(chuàng)建的符號可以用于值。
- typedef 是由編譯器來解釋,而不是預(yù)處理器。
- typedef 使用起來更加靈活。
下面使用typedef定義一個數(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定義一個變量c。輸出結(jié)果如下:

此時如果使用 #define 來替換,好像也可以。

這里使用 #define 將unsigned char替換為 BYTE好像也正確。
下面在看一個例子。
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定義兩個指針s1和s2,這樣s1和s2都是指向字符的指針。接著給這兩個指針賦值,然后打印出來。

這時使用 #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;
}
這時候編譯程序的時候,程序會報錯。

這時為什么呢?因為使用typedef的時候,是定義了一個新的數(shù)據(jù)類型。
typedef char * STR; STR s1,s2;
相當(dāng)于
char *s1, *s2; s1="abc"; s2="123";
s1和s2都是指向字符類型的指針。
如果使用 #define 的時候,系統(tǒng)只是簡單的替換。
#define STR char * STR s1,s2;
將STR用 char * 進行替換
char *s1,s2; s1="abc"; s2="123";
替換后只有s1是指針,s2依然是一個char類型的變量。所以給s2賦值一個字符串的時候系統(tǒng)就會報錯。因此要重新定義一個數(shù)據(jù)類型的時候,要使用typedef,這個在定義結(jié)構(gòu)體的時候使用的非常多。
typedef struct Date
{
int year;
int month;
int day;
} DT;
使用typedef 將結(jié)構(gòu)體 struct Date 重新定義為DT類型,這樣在使用DT定義變量的時候,就相當(dāng)于使用了 struct Date 來定義變量。
typedef struct Date
{
int year;
int month;
int day;
} DT;
DT d1 = {2021,10,1};
DT d2 = {2021,10,10};
等價于
struct Date
{
int year;
int month;
int day;
};
struct Date d1 = {2021,10,1};
struct Date d2 = {2021,10,10};
這樣通過使用 typedef 來重新定義一個新的類型,使代碼寫起來更加的簡潔。這種方法在單片機的庫函數(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 類型,這樣在初始化的時候,直接使用GPIO_InitTypeDef 類型就可以定義一個關(guān)于GPIO的結(jié)構(gòu)體。
在定義數(shù)據(jù)類型的時候,也會用到 typedef 重新定義一個數(shù)據(jù)類型。

通過tepedef 定義新的數(shù)據(jù)類型,增加了代碼的可讀性和移植性。這里說的新的數(shù)據(jù)類型不是創(chuàng)建了一個系統(tǒng)不存在的數(shù)據(jù)類型,而是給已經(jīng)存在的某個類型增加了一個方便使用的標(biāo)簽。而這個標(biāo)簽又不同于 #define 只是簡單的符號替換。
總結(jié)
到此這篇關(guān)于C語言入門學(xué)習(xí)筆記之typedef簡介的文章就介紹到這了,更多相關(guān)C語言typedef簡介內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Matlab控制電腦攝像實現(xiàn)實時人臉檢測和識別詳解
人臉識別過程主要由四個階段組成:人臉檢測、圖像預(yù)處理、面部特征提取和特征識別。這篇文章主要介紹了如何使用MATLAB控制筆記本電腦的攝像頭,并進行實時人臉檢測和識別,需要的可以參考一下2022-10-10
Visual Studio調(diào)試C/C++教程指南
VisualStudio是微軟開發(fā)的一款集成開發(fā)環(huán)境軟件,本文主要介紹了Visual Studio調(diào)試C/C++教程指南,熟悉地掌握基于VS的C/C++調(diào)試技術(shù),可以大幅提升調(diào)試性能,感興趣的可以了解一下2024-06-06
C++實現(xiàn)Matlab的zp2tf函數(shù)的示例代碼
matlab?的?zp2tf?函數(shù)的作用是將極點形式的?H(s)?函數(shù)的分母展開,本文主要為大家介紹了C++實現(xiàn)Matlab的zp2tf函數(shù)示例代碼,需要的可以參考一下2023-04-04
Qt使用QCamera實現(xiàn)切換相機,分辨率和圖像捕獲功能
這篇文章主要為大家介紹了如何利用Qt中的相機類QCamera,取景器類QCameraViewfinder,圖像捕獲類QCameraImageCapture實現(xiàn)切換相機、分辨率和圖像捕獲功能,需要的可以了解一下2023-04-04

