定义类型typedef与#define一样?

本文探讨了在C语言中typedef与#define在定义类型别名时的差异,通过示例展示了typedef如何处理指针常量和数组类型,以及宏定义可能带来的问题。文章指出typedef在处理类型时作为一个整体,而#define仅做文本替换,可能导致类型错误。此外,还讨论了typedef在定义数组类型上的优势,但指出#define也可以通过特定方式实现类似功能。
摘要由CSDN通过智能技术生成

e12d941660130435480b27fbeceb1756.gif

正文


大家好,我是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进行赋值则编译不通过。

c76d0ea0c0755e94b2464862d32417fc.png

编译结果出来你应该就明白了,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}

因为宏定义无法像普通定义变量那样:"类型 变量"的形式,所以认为同事的说法也算对,不过对于如上面代码的宏定义来定义变量,其实也差别不大吧。

ccefdb7df14ce3985cc37a832d1af4d5.png

最后

      好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个~

3a5a7e6daede98fc04f4465f3d9ffd59.png

推荐专辑  点击蓝色字体即可跳转

☞  MCU进阶专辑 31488d985ce7f7f96c4cb692f9412db7.gif

☞  嵌入式C语言进阶专辑 aab6fb4a891da4ccb8e58d44965364c8.gif

☞  “bug说”专辑 0f4ee80ae5de1f588b85a4d4f7f0ac03.gif

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|电能控制技术

☞ 专辑 | 从单片机到Linux

01ad47900c28b689570d3efe571a2d8e.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值