天天看點

定義類型typedef與#define一樣?

定義類型typedef與#define一樣?

正文

大家好,我是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與#define一樣?

編譯結果出來你應該就明白了,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}
           

因為宏定義無法像普通定義變量那樣:"類型 變量"的形式,是以認為同僚的說法也算對,不過對于如上面代碼的宏定義來定義變量,其實也差别不大吧。

定義類型typedef與#define一樣?

最後

      好了,今天就跟大家分享這麼多了,如果你覺得有所收獲,一定記得點個贊~

定義類型typedef與#define一樣?

推薦專輯  點選藍色字型即可跳轉

☞  MCU進階專輯 

定義類型typedef與#define一樣?

☞  嵌入式C語言進階專輯 

定義類型typedef與#define一樣?

☞  “bug說”專輯 

定義類型typedef與#define一樣?

☞ 專輯|Linux應用程式程式設計大全

☞ 專輯|學點網絡知識

☞ 專輯|手撕C語言

☞ 專輯|手撕C++語言

☞ 專輯|經驗分享

☞ 專輯 | 從單片機到Linux

定義類型typedef與#define一樣?