正文
大家好,我是bug菌!
最近在開發中使用typedef的時候掉了一次坑,這裡記錄一下同時分享給大家~
1
typedef與#define
大部分朋友在編寫代碼的時候都會把無符号類型、結構體等等進行"簡化",要麼用宏定義進行文本替換,要麼就通過typedef來定義一個類型别名。
參考代碼:
1#include <stdio.h>
2#include <stdlib.h>
3
4#define uint16 unsigned int
5typedef unsigned int uint16_t;
6
7int main(int argc, char *argv[]) {
8
9 uint16 Var1 = 1;
10 uint16_t Var2 = 10;
11
12 printf("var1:%d \r\nvar2:%d\n",Var1,Var2);
13
14 return 0;
15}
似乎在一般人眼裡兩種方式并沒有什麼差別,有些人習慣用宏,有些人習慣用typedef,甚至一套代碼中還出現兩種定義,不過使用typedef來相容不同平台的類型更加的專業。
兩者的差別其實還是很明顯的,隻是大部分人在編碼的過程中沒有遇到兩者差異的情況,
那麼這裡就舉個例子:
參考代碼:
1#include <stdio.h>
2#include <stdlib.h>
3
4#define ptrINT int *
5typedef int* ptrint_t;
6
7int main(int argc, char *argv[]) {
8
9 int temp1 = 6;
10 int temp2 = 12;
11 const ptrINT Var1 = &temp1;
12 const ptrint_t Var2 = &temp1;
13
14 Var1 = &temp2;
15 //*Var1 = 10; //指針内容為可讀,禁止通路
16
17 printf("*Var1 = %d\n",*Var1);
18
19 //Var2 = &temp2; //error
20
21 return 0;
22}
如果typedef與#define沒啥差異的話,那麼測試代碼中的Var1與Var2使用方法應該是一樣的,但當我們使用var2進行指派則編譯不通過。
編譯結果出來你應該就明白了,typedef把整個int*作為了一個整體,與基本類型int,float等一樣,此時const修飾的是Var2變量,與int * const等價,其指針所指向的位址無法改變,但内容*Var的内容可以進行修改。
同樣還有一個類似且非常值得注意的地方:
參考代碼:
1#include <stdio.h>
2#include <stdlib.h>
3
4#define ptrINT int *
5typedef int* ptrint_t;
6
7int main(int argc, char *argv[]) {
8
9 ptrint_t pVar1,pVar2;
10 ptrINT pVar3,pVar4;
11
12 int Temp = 10;
13
14 pVar1 = &Temp;
15 pVar2 = &Temp;
16 pVar3 = &Temp;
17 pVar4 = &Temp;
18
19 return 0;
20}
問題就處在pVar4的定義上,此時pVar4僅僅隻是一個int類型而非int*類型,這也是宏定義所帶來的弊端。
這樣大家應該對typedef定義的整體類型與#define定義的宏有了一個較好的了解了吧。
2
數組類型是typdef專屬?
順便問了一下同僚:你覺得typedef還有與#define不同的地方嗎?他想了想,回答道 : typedef可以直接定義數組類型,而#define不能。
他的回答也對,但是也不完全對:
參考代碼:
1#include <stdio.h>
2#include <stdlib.h>
3
4#define ARRAY_SIZE 5
5
6typedef int Array[ARRAY_SIZE] ;
7
8#define dArray(a) int a[ARRAY_SIZE]
9
10int main(int argc, char *argv[]) {
11
12 Array array1;
13 dArray(array2);
14
15 for(int i = 0;i < ARRAY_SIZE;i++)
16 {
17 array1[i] = i;
18 }
19
20 for(int i = 0;i < ARRAY_SIZE;i++)
21 {
22 printf("array1[%d]=%d\n",i,array1[i]);
23 }
24
25 printf("\r\n");
26
27 for(int i = 0;i < ARRAY_SIZE;i++)
28 {
29 array2[i] = i + 1;
30 }
31
32 for(int i = 0;i < ARRAY_SIZE;i++)
33 {
34 printf("array2[%d]=%d\n",i,array2[i]);
35 }
36
37 return 0;
38}
因為宏定義無法像普通定義變量那樣:"類型 變量"的形式,是以認為同僚的說法也算對,不過對于如上面代碼的宏定義來定義變量,其實也差别不大吧。
最後
好了,今天就跟大家分享這麼多了,如果你覺得有所收獲,一定記得點個贊~
推薦專輯 點選藍色字型即可跳轉
☞ MCU進階專輯
☞ 嵌入式C語言進階專輯
☞ “bug說”專輯
☞ 專輯|Linux應用程式程式設計大全
☞ 專輯|學點網絡知識
☞ 專輯|手撕C語言
☞ 專輯|手撕C++語言
☞ 專輯|經驗分享
☞ 專輯 | 從單片機到Linux