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

一、问题

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

二、解答

1. #define 与 typedef 的相似之处

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

#define STRINT chartypedef 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.mzph.cn/pingmian/9343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【环境配置】vsCode 中使用 conda 配置虚拟环境

文章目录 准备前言在 vsCode 中直接创建创建步骤测试更新环境 使用 Anaconda 建立虚拟环境创建步骤在 vsCode 中选择环境 总结 准备 在看本博客之前,希望大家有以下知识储备: 能够正确安装 vsCode,并配置好 python 环境;了解并安…

初认识鸿蒙

初认识鸿蒙 相关鸿蒙的华为网站华为开发者官方网站初学者模块:社区--鸿蒙--论坛模块:学堂--鸿蒙--学习路径模块:Codelabs--鸿蒙有经验者产品页黄大年茶思屋其他页面HarmonyOS Developer初学者模块:文档模块:开发--HarmonyOS模块:开发--HMS Core模块:开发--AppGallery Co…

Backup

目录 1、 Backup 1.1、 SQLException 1.2、 printInfo 1.3、 getSQLValue Backup package com.my.blog.website.utils.backup;

一觉醒来 AI科技圈发生的大小事儿 05月09日

📳AlphaFold 3 重磅问世,全面预测蛋白质与所有生命分子相互作用及结构,准确性远超以往水平 Google DeepMind发布了AlphaFold3模型,能够联合预测蛋白质、核酸、小分子等复合物结构,准确性显著提高,对跨生物…

安服仔养成篇——等级保护

最近刚好对等保的一些知识有疑问,查了资料解答后刚好又能写一期,这期就用问答的方式来写吧,刚刚好给和我一样蒙蔽的师傅们走进等保。 ①等级保护针对哪些单位? 答: 政府机关:各大部委、各省级政府机关、各…

Flask SQLAlchemy 技术指南

文章目录 什么是 Flask SQLAlchemy?安装 Flask SQLAlchemy创建 Flask 应用和数据库模型添加和查询数据运行 Flask 应用总结**数据库迁移(Database Migrations)****复杂查询****关系模型****事务处理****性能优化****安全性****扩展功能** Fla…

深化产教融合,泰迪智能科技助力西南林业大学提质培优

2024年5月7日,泰迪智能科技昆明分公司院校部总监查良红和数据部负责人余雄亮赴西南林业大学理学院就工作室共建事宜进行交流会谈。西南林业大学理学院院长张雁、党委副书记魏轶、副院长谢爽、就业负责人罗丽及学生代表参与本次交流会。 会议伊始,谢副院长…

邮件大附件系统如何进行安全、高效的大附件发送?

邮件大附件系统是一套解决传统电子邮件系统,在发送大文件时遇到限制的解决方案。由于传统电子邮件系统通常对附件大小有限制,这使得发送大文件变得困难。邮件大附件系统通过各种技术手段,允许用户发送超过传统限制的大文件,通常在…

Java面试常见问题

操作系统 1.Q: 在操作系统中,什么时候会发生用户态到内核态的切换 A: 操作系统中,用户态和内核态是两种不同的权限级别,他们对应着不同的执行环境和执行权限。用户态事指程序在一般的运行情况下的的级别,它具有别较低的权限级别&…

Civitai 转 diffusers 的 base model

Civitai 转 diffusers 的 base model Q1 Q1 pipe StableDiffusionControlNetImg2ImgPipeline.from_pretrained(# "runwayml/stable-diffusion-v1-5", "/data/model/basemodel/realistic_v10BAKEDVAE.safetensors",controlnetcontrolnet, torch_dtypetorc…

华为ICT学院教师指南(HCAI认证)结课测试

华为基于“平台+生态”战略,坚持联合教育培训机构、行业协会及合作伙伴等各类资源,共同构筑ICT人才生态良性发展的使能平台,这其中华为的角色有哪些? 0 人才标准的制定者 1 人才联盟的建设者 2 人才价值的传播者 3 以上全部 下列哪些技术方向属于华为授权课程? 0 网络…

[Spring框架] 手写Spring

目录 一、背景 二、简易版Spring代码 三、使用自定义Spring代码 四、总结 一、背景 作为一个后端程序员,Spring框架是在开发中必不可少的,相信很多人都学过Spring的底层原理并且看过很多源码。但是对我来说,实操是一个会加深对代码的理解…

07-面向对象编程(基础部分)

学习java最核心最重要的就是要理解面向对象。 1. 类与对象 1.1 介绍 类是抽象的,概念的,代表一类事物,比如人类,猫类,狗类.., 即它是数据类型。 对象是具体的,实际的,代表一个具体事物,&…

Leetcode227. 基本计算器 II

Every day a Leetcode 题目来源&#xff1a;227. 基本计算器 II 解法1&#xff1a;单栈模拟 因为没有括号&#xff0c;所以可以简化成单栈。 代码&#xff1a; class Solution { public:int calculate(string s){vector<int> nums;char preSign ;int num 0;int n …

可以修改linux 文件的所有者吗

是的&#xff0c;你可以修改Linux文件的所有者。这通常是通过chown&#xff08;change owner&#xff09;命令来完成的。以下是使用chown命令的一些示例&#xff1a; 更改文件的所有者&#xff1a; chown new_owner file.txt这条命令会将file.txt的所有者更改为new_owner。 同…

如果数据给的是树形 转好的树形结构并且是有两个二级children的话 该如何写?

第一我们要自己写一个children 并且张数据里面的所要渲染的二级进行赋值 赋给我们新建的children 以下是代码转树形赋值 organ().then(function (res) {console.log(res); // 成功回调// setLists(res.data.data)res.data.data res.data.data.map((obj) > ({...obj, // …

Kafka 面试题(三)

1. 简述什么是 Kafka 的 Broker &#xff1f; Kafka的Broker是Kafka集群中的一个核心组件&#xff0c;扮演着消息代理的角色。它是生产者和消费者之间的中间件&#xff0c;负责接收、存储和分发消息。具体来说&#xff0c;Broker接收来自生产者的消息&#xff0c;并将其持久化…

(十二)C语言的结构体

一.结构体 数组&#xff1a;允许定义可存储相同类型数据项的变量&#xff0c; 结构&#xff1a;另一种用户自定义的可用的数据类型&#xff0c;它允许您存储不同类型的数据项。 特点&#xff1a;结构体中的数据成员可以是基本数据类型&#xff08;如 int、float、char 等&…

Android 系统版本与SDK API对应关系-2024.5

官网地址&#xff1a;https://developer.android.google.cn/tools/releases/platforms?hlth

Vue 监控变化watch

1、watch 监控某个定义的属性的值,如果想要深层次的监听则需要定义deep:true 2、监控多层次单个元素使用"b.aa" 3、监控多层次所有的值定义deep:true ******data:{a:true,b:{aa:1,bb:2 }}*****catch:{a:{handler(newavlue,oldvalue){}},//监控b里面的aab.aa:{h…