正文
大家好,我是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进阶专辑
☞ “bug说”专辑
☞ 专辑|手撕C语言
☞ 专辑|经验分享