C语言typedef 与 #define 宏的相似之处与不同之处是什么?

一、问题

        typedef 关键字的功能就是给⼀个已经存在的数据类型起⼀个在本程序中能够体现实际作⽤的名字。#define 宏定义是为⼀个字符串起⼀个别名,在程序中应⽤到该字符串时, ⽤这个别名来替代。那么 typedef 与 #define 的相似之处是什么,不同之处又是什么呢?

二、解答

1. #define 与 typedef 的相似之处

        宏定义和类型定义有很多相似之处,通常都可以理解为为⼀个字符起别名,在程序中⽤⼀个新的字符代替原有的字符。例如:

#define STRINT char

typedef char STRING;

        这两句代码都是⽤ STRING 代替原有的字符 char。⽽ STRING str;的含义是定义了⼀个 char 型的变量 str。 在此例中,宏定义和类型定义起到的作⽤是相同的,但实质上是有区别的。

2. 两者的区别

(1)在上述为 char 起别名的两种⽅法中,实质含义是不同的。

        例如,#define 是在预编译时⽤ STRING 这个字符串代替 char 这个字符串;⽽ typedef 是为 char 字符串类型定义了⼀个别名,并不是简单的字符串替换。STRING 这个字符串与 char 的功能相同,代表了 ⼀个字符串类型的数据类型。

        请看下⾯的例⼦,观察两者的区别。

#define INTP int*

typedef int* INTP;

        其中“ INTP a,b; 〞在宏定义的定义下,可以理解成 “ int *a,b; ”,表示声明了⼀个整型指针变量a 和⼀个整型变量 b ;若在类型定义的定义下,可以将其理解成 “ int *a;int *b; ”,表示声明了两个整型变量指针 a 和 b 。

(2)宏定义和类型定义还有⼀个很⼤的区别,然⽽却往往被⼈忽略。

        那就是宏定义的句尾没有分号作为结束语句的标志;若有,就会被当做字符串替换进程序中。由此可以更明显地看出,宏定义通常被⽤作定义常量,以及⽤来实现“ 表⾯似和善,背后⼀长串” 的宏,⽽且其本⾝并不在编译过程中进⾏,⽽是在预处理过程中就已经完成了。因此,很难发现潜在的错误及代码维护问题。

        例如,代码“ #define PI 3.1415926; ”只在程序源代码中应⽤到 PI 时才会出现编译错误,错误就在于⽤ PI 这个字符代替了“ 3.1415926; ”这个字符串,⽐正常的数字多了个分号。

三、总结

        #define 原本在 C 语⾔中是为了定义常量,然⽽随着 C++ 中的 const、 enum 和 inline 的出现,使它渐渐地变成了起别名的⼯具。但是,在定义别名这个功能上,最好还是习惯应⽤ typedef。

        为了尽可能地兼容,⼀般都遵循#define 定义 “ 可读 ” 的常量(常量表达式), ⽽ typedef 则常⽤来定义关键字或元长的数据类型的别名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/609344.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

可视化数据大屏带你走进工业4.0

工业4.0是指第四次工业革命,是对工业生产的一种新的理念和模式。它通过将物理系统与数字系统相互连接,实现工业生产的智能化、自动化和网络化。工业4.0的核心目标是通过数字化技术和数据驱动的方法,实现生产过程的高度灵活性、效率和智能化。…

探索人工智能的深度神经网络:理解、应用与未来

深度神经网络(DNNs)是一种人工智能模型,其灵感来自于人脑神经元之间的连接。它们由多个层次组成,每一层都包含多个神经元,这些神经元通过权重连接在一起。信息通过网络的输入层传递,并经过一系列隐藏层&…

Verilog复习(二)| 时延

时延分为惯性延迟(Inertial Delay (Gates) )和传输延迟(Transport Delay (Nets) ) 示例: wire #5 net_1; // 5 unit transport delayand #4 (z_out, x_in, y_in); // 4 unit inertial delay assign #3 z_out a &…

Windows安装RabbitMQ教程(附安装包)

需要两个安装包 Erlang 安装包: https://download.csdn.net/download/Brevity6/89274663 (自己从官网下载也可以) RabbitMQ Windows 安装包: https://download.csdn.net/download/Brevity6/89274667 (自己从官网下载也可以) Erlang安装 Erlang安装傻瓜式下一…

2024年想要开一家抖音小店,需要多少钱?一篇详解!

大家好,我是电商糖果 随着抖音卖货的持续火爆,抖音小店也成了电商行业讨论度最大的项目之一。 不少朋友都想知道,如果今年开抖音小店大概需要多少钱。 糖果做小店的时间也比较长,也经营了多家小店。 对于开一家抖音小店需要多…

蓝桥杯EDA客观题

目录 前言 一、PCB类知识点和题目分析 1.电阻 2.电容 3.封装类 4.单位转换类 5.电路板结构类 6.PCB绘制规则 7.立创软件 8.PCB硬件 线性电源和开关电源 二、数电知识点和题目分析 1.门电路 2.逻辑代数 3.组合逻辑电路 4.触发器 5.时序逻辑电路 6.其他 三、模…

java学习笔记反射机制

2.关于反射的理解 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何 类的内部信息,并能直接操作任意对象的内部属性及方法。 框架 反射 注解 设计模式。 3.体会反射机制的“动态性” //…

vue3 - 图灵

目录 vue3简介整体上认识vue3项目创建Vue3工程使用官方脚手架创建Vue工程[推荐] 主要⼯程结构 数据双向绑定vue2语法的双向绑定简单表单双向绑定复杂表单双向绑定 CompositionAPI替代OptionsAPICompositionAPI简单不带双向绑定写法CompositionAPI简单带双向绑定写法setup简写⽅…

链表的中间结点(C语言)———链表经典算法题

题目描述. - 力扣(LeetCode): ​ 答案展示: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* middleNode(struct ListNode* head) {struct ListNode* fast,…

商业写字楼如何选择停车场管理系统?停车场管理系统建设有哪些注意事项

在现代商业环境中,写字楼停车场的高效管理对于维护企业形象、提高员工满意度以及增强客户体验至关重要。写字楼停车场管理的特点主要包括高流量、高周转率、多样化的车辆类型、高安全性要求以及对客户体验的重视,那么商业写字楼停车场应该从哪些方面提升…

【计网】TCP中的滑动窗口

🍎个人博客:个人主页 🏆个人专栏:日常聊聊 ⛳️ 功不唐捐,玉汝于成 目录 正文 工作原理如下: 结语 我的其他博客 正文 TCP(传输控制协议)中的滑动窗口是一种用于流量控制和拥…

[Kubernetes] sealos部署 K8s 集群

文章目录 1.sealos 介绍2.操作系统基础配置3.安装部署 K8s4.验证 K8s 集群5.部署测试资源 1.sealos 介绍 Sealos 是一个基于 Kubernetes 内核的云操作系统发行版。它采用云原生方式,摒弃传统的云计算架构,转向以 Kubernetes 为云内核的新架构。这使得企…

30万奖励!2023-2024年度成都市工业企业“小升规”申报对象奖补、材料程序

一、申报对象及奖励标准 (一)2023年度申报对象及奖励标准。2022年3月1日至2022年12月31日首次进入成都市规模以上工业名录库的企业。2022年营业收入在2000万元(含)至5000万元的,给予10万元奖励;2022年营业…

4. 分布式链路追踪客户端工具包Starter设计

前言 本文将从零搭建分布式链路追踪客户端工具包的Starter,并将在后续文章中逐步丰富支持的场景。这里首先将搭建一个最基础的Starter,能提供的功能和1. 看完这篇文章我奶奶都懂Opentracing了一文中的示例demo类似。 相关版本依赖如下。 opentracing-…

大模型LLM之SFT微调总结

一. SFT微调是什么 在大模型的加持下现有的语义理解系统的效果有一个质的飞跃;相对于之前的有监督的Pre-Train模型;大模型在某些特定的任务中碾压式的超过传统nlp效果;由于常见的大模型参数量巨大;在实际工作中很难直接对大模型训…

视频剪辑批量转码技巧:如何将MP4视频快速转换为MP3音频的方法

在视频剪辑和音频处理的领域中,经常需要将视频文件转换为音频文件,特别是将MP4视频转换为MP3音频。这样的转换不仅可以减少文件大小,方便传输和存储,还可以在不损失音频质量的情况下,方便在各种设备上播放。下面&#…

AI写的论文AI疑似度太高怎么办?教你一招降低aigc痕迹

随着 AI 技术迅猛发展,各种AI辅助论文写作的工具层出不穷! 为了防止有人利用AI工具进行论文代写,在最新的学位法中已经明确规定“已经获得学位者,在获得该学位过程中如有人工智能代写等学术不端行为,经学位评定委员会…

【随笔】Git 高级篇 -- 不带 source 参数的命令 git fetch git push(三十九)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

电脑硬盘故障,这5种情况要了解!

在数字化时代,电脑硬盘作为存储数据的重要设备,其稳定性和安全性直接关系到用户的数据安全和工作效率。然而,硬盘故障却是一个无法完全避免的问题。为什么会出现电脑硬盘故障?出现该问题时应该如何解决?一文带你弄懂答…

【个人博客搭建】(18)使用Quartz.NET 定时备份数据库

Quartz.NET在系统主要承担的一些关键功能: 任务调度:Quartz.NET 允许开发人员创建、调度和管理定时任务,支持简单触发器和Cron表达式等多样化的触发策略。灵活性:Quartz.NET 提供了灵活的任务安排机制,不仅支持基于时间…
最新文章