0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

typedef与#define有什么差异吗

冬至配饺子 来源:最后一个bug 作者:bug菌 2022-08-11 14:34 次阅读

最近在开发中使用typedef的时候掉了一次坑,这里记录一下同时分享给大家~

1、typedef与#define

大部分朋友在编写代码的时候都会把无符号类型、结构体等等进行"简化",要么用宏定义进行文本替换,要么就通过typedef来定义一个类型别名。

参考代码:

pYYBAGL0oiKAF0AlAAB94J8Fr1A803.png

似乎在一般人眼里两种方式并没有什么区别,有些人习惯用宏,有些人习惯用typedef,甚至一套代码中还出现两种定义,不过使用typedef来兼容不同平台的类型更加的专业。

两者的区别其实还是很明显的,只是大部分人在编码的过程中没有遇到两者差异的情况,

那么这里就举个例子:

参考代码:

pYYBAGL0ojWAIYyfAACxDZDrVcM678.png

如果typedef与#define没啥差异的话,那么测试代码中的Var1与Var2使用方法应该是一样的,但当我们使用var2进行赋值则编译不通过。

pYYBAGL0okeALeqiAAB-_jnV8V4600.png

编译结果出来你应该就明白了,typedef把整个int*作为了一个整体,与基本类型int,float等一样,此时const修饰的是Var2变量,与int * const等价,其指针所指向的地址无法改变,但内容*Var的内容可以进行修改。

同样还有一个类似且非常值得注意的地方:

参考代码:

pYYBAGL0olqAKaiNAACU8LglwYI762.png

问题就处在pVar4的定义上,此时pVar4仅仅只是一个int类型而非int*类型,这也是宏定义所带来的弊端。

这样大家应该对typedef定义的整体类型与#define定义的宏有了一个较好的理解了吧。

2、数组类型是typdef专属?

顺便问了一下同事:你觉得typedef还有与#define不同的地方吗?他想了想,回答道 : typedef可以直接定义数组类型,而#define不能。他的回答也对,但是也不完全对:

参考代码:

poYBAGL0onSAPD6gAAEL4i4ezEU399.png

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

poYBAGL0ooWARUSBAAB0FqdAZz0370.png



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码
    +关注

    关注

    6

    文章

    835

    浏览量

    54458
  • typedef
    +关注

    关注

    0

    文章

    23

    浏览量

    9520
  • float
    +关注

    关注

    0

    文章

    8

    浏览量

    7712
收藏 人收藏

    评论

    相关推荐

    C语言中的typedef的应用

    C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE。
    发表于 03-06 11:34 146次阅读
    C语言中的<b class='flag-5'>typedef</b>的应用

    TC234和TC264内核差异是什么?

    TC234为Lockstep Core,TC264为Dual Core。Lockstep Core和Dual Core什么差异
    发表于 02-05 08:14

    求助,英飞凌单片机程序开发和STM32程序开发之间多少差异

    英飞凌单片机程序开发和STM32程序开发之间多少差异?英飞凌单片机有没有类似库函数的东西?
    发表于 02-05 07:14

    LED洗墙灯跟线条灯的区别,使用的芯片有何差异

    LED洗墙灯跟线条灯的区别,使用的芯片有何差异
    的头像 发表于 01-05 14:30 329次阅读

    【科普小贴士】BJT和MOSFET的差异

    【科普小贴士】BJT和MOSFET的差异
    的头像 发表于 12-13 14:21 615次阅读
    【科普小贴士】BJT和MOSFET的<b class='flag-5'>差异</b>

    define宏定义

    define宏定义 以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定义一个宏,程序在预处理阶段将用define定义的来内容进行了替换。因此在程序运行时
    的头像 发表于 11-24 15:35 426次阅读

    放大器中,大信号和小信号电压增益差异

    问题:放大器中,大信号和小信号电压增益差异
    发表于 11-15 07:43

    为什么我定义的结构体不能用--&gt;来调用结构体的元素?

    ; }GPIO_TypeDef; #define GPIOB((GPIO_TypeDef*)GPIOB_BASE) 调用时变成了这样
    发表于 11-11 19:06

    求助,关于C语言中的typedefdefine问题

    程序中typedef unsigned charUINT8和#define UINT8 unsigned char什么特殊区别吗?不可以用一个来代替吗?为什么一个程序中要用两个?自己一直都是只用一个,没有涉及到用两个的情况,求
    发表于 10-26 06:30

    Typedef定义类型后不实用会占用内存吗?

    Typedef定义类型后不实用会占用内存么
    发表于 09-26 07:18

    第3期-#definetypedef用法和区别-STC32G12K128系列视频#知识分享 #STC32G

    stc32
    学习电子知识
    发布于 :2023年07月10日 22:14:16

    typedef哪些用途?

    的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。 用途三: 用typedef来定义与平台无关的类型。 比如定义一个叫 REAL
    发表于 06-25 07:39

    open sdk中的c_types.h错误怎么解决?

    esp-open-sdk(sdk 的根目录)中,我一个 c_types-c99.patch 正是这样做的,它用 #if 0 / #endif 包围了 c_types.h 中的 typedef
    发表于 06-12 08:51

    第34集(7.2#100))typedef 与 #define,你确定你了解它们的差异

    define
    于振南的单片机世界
    发布于 :2023年06月01日 23:38:40

    #definetypedef的真正区别

    #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,比如:
    的头像 发表于 05-31 15:41 382次阅读
    #<b class='flag-5'>define</b>和<b class='flag-5'>typedef</b>的真正区别