typedef 和 # define 用法区别

news2024/10/7 18:26:57

typedef 和 # define 用法区别

  • 前言
  • 1. 原理不同
    • 1.1 typedef int * int_ptr;与#define int_ptr int * 详细讲解
  • 2. 功能不同
  • 3. 作用域不同

前言

博主在牛客网上看到了一道有关typedef和# define题目。发现有很多初学的小伙伴对两者的用法不是特别清楚,所以博主在这总结以下相关用法和区别。
话不多说,先来看看原题吧!(答案c)
在这里插入图片描述

1. 原理不同

#define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。

例如:
#define PI 3.1415926
程序中的:area=PI *r *r 会替换为3.1415926 *r *r
如果你把#define语句中的数字9 写成字母g 预处理也照样带入。

typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。

1.1 typedef int * int_ptr;与#define int_ptr int * 详细讲解

在开头我们看到的问题中typedef int * int_ptr;与#define int_ptr int *
作用都是用int_ptr代表 int * ,但是二者不同,正如前面所说 ,#define在预处理 时进行简单的替换,而typedef不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型。也就是说;

#define int_ptr int *
int_ptr a, b; //相当于int * a, b; 只是简单的宏替换

typedef int* int_ptr;
int_ptr a, b; //a, b 都为指向int的指针,typedef为int* 引入了一个新的助记符

这也说明了为什么下面观点成立

 typedef int * pint ;
#define PINT int *

那么:
const pint p ;//p不可更改,但p指向的内容可更改
const PINT p ;//p可更改,但是p指向的内容不可更改。

pint是一种指针类型 const pint p 就是把指针给锁住了 p不可更改
而const PINT p 是const int * p 锁的是指针p所指的对象。

2. 功能不同

  • typedef用来定义类型的别名,起到类型易于记忆的功能。另一个功能是定义机器无关的类型。如定义一个REAL的浮点类型,在目标机器上它可以获得最高的精度:typedef long double REAL, 在不支持long double的机器上,看起来是这样的,typedef double REAL;在不支持double的机器上,是这样的,typedef float REA
  • #define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

3. 作用域不同

  • #define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用,而typedef有自己的作用域。

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

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

相关文章

python内存

在python中,一切都是对象。Python从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象。 Java虽然也是面向对象编程的语言,但是血统没有Python纯正。比如Java的八种基本数据类型之一int,在持久化的时候…

HCIA-NAT

目录 NAT:网络地址转换 NAT原理: NAT转换原理图: 静态NAT 静态NAT的工作原理: 静态NAT配置命令 静态NAT配置实例: 动态NAT 动态NAT的工作原理 动态NAT: 动态NAT配置命令 动态NAT案例 NAPT NA…

css蓝桥杯--⾃适应⻚⾯

目录 一、介绍二、准备三、⽬标四、代码五、完成 一、介绍 响应式布局是在 2010 年 5 ⽉份提出的⼀个概念,这个概念是为解决移动互联⽹浏览⽽诞⽣的。简⽽⾔之,就是⼀个⽹站能够兼容多个终端——⽽不是为每个终端做⼀个特定的版本。通过响应式布局可以为…

EXCEL文本处理总结:如何查找(/定位)字符串内,符合条件的多个符号里的最后一个?

目录 题外话:学习总结 1 新手切忌贪多 2 熟练者切忌懒惰 3 这2件事恰恰都和人性相反 1 EXCEL文本处理相关函数 2 查找函数 find() 和 search() 2.1 find() 2.2 search() 2.3 下面是测试的公式情况 3 如何查找(定位)符合条件的某个字符的位置?…

MySQL触发器的使用

目录 一、前言二、触发器分类1.插入触发器2.更新触发器3.删除触发器 三、查看触发器四、异常处理五、小结 一、前言 各种主流数据库,都集成了触发器的功能。触发器提供了一种机制,允许开发者在对数据库表的插入、更新、删除的前后捕获相应的数据行。从而针对数据行实现特定的逻…

DebugView的使用

目录 一、前言二、本机调试1.DebugView程序文件说明2.OutputDebugString函数使用3.示例程序4.远程调试 三、问题与注意事项四、小结 一、前言 DebugView是windows下的一款调试工具,可以捕获程序输出的日志,分为64位和32位,支持应用层和内核层的日志捕获,利用它排除bug是个不错的…

chatgpt赋能python:Python开发手机软件的优势和挑战

Python开发手机软件的优势和挑战 随着智能手机的普及,移动应用开发已成为当前最热门的技术领域之一。随着越来越多的企业意识到移动应用的重要性,越来越多的开发者开始加入这个领域。 在移动应用的开发中,由于其高效性和易于学习的特点&…

【Flutter】Dart/Flutter SDK如何降低版本、回退到指定版本

因为dart3.0以后不再支持 no-sound-null-safety;但是有些项目不得以切换到dart3.0以前继续使用运行项目 方法1: 通过 $ flutter downgrade命令,将flutter降级为当前通道的上一个活动版本; 如果没有存在老版本则会提示 flutter …

从零手写操作系统之RVOS软件定时器实现-08

从零手写操作系统之RVOS软件定时器实现-08 定时器分类软件定时器的分类软件定时器设计与实现软件定时器调用流程增加对周期性定时任务支持测试优化点 本系列参考: 学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春 整理而来,主要作为xv6操作系统学习的一个前置基础。…

chatgpt赋能python:Python强制等待:如何优化你的Python技能

Python强制等待:如何优化你的Python技能 在Python编程中,强制等待是一种非常重要的程序设计方式。Python代码中的强制等待通常使用time.sleep()方法实现。在本文中,我们将详细介绍什么是Python强制等待,以及如何使用它来优化你的…

基于最近电平逼近的开环MMC逆变器MATLAB仿真模型

资源地址: 模型介绍: MATLAB21b版本 DC:12kV,N=12, 采用最近电平逼近调制,采用基于排序的均压方法,冒泡排序+桥臂电流方向判断。 连接负载,可以得到13电平相电压波形。…

Windows10下使用VS2019编译chromium

Windows10下使用VS2019编译chromium 工具设置代理cmd运行gclient配置VS的版本,环境变量设置下载源码生成编译工具 下载depot_tools,并配置环境变量,PATH下添加depot_tools的解压路径E:\src\depot_tools 设置代理 控制台管理员权限执行 git config --global http.proxy…

CenoOS连接 SQL Server

目录 1、问题:2、解决步骤3、拓展3.1 常用查询3.2 SQL Server 语句规则3.3 python调用 1、问题: 连接:ProviderSQLOLEDB.1;Persist Security InfoFalse;User IDXXX;passwordXXXXX;Initial CatalogXXXXX;Data SourceXXXXX; 解析:…

chatgpt赋能python:Python屏幕截图:完美的方法记录你的屏幕

Python屏幕截图:完美的方法记录你的屏幕 Python作为一种高级编程语言,被广泛用于开发各种应用程序和游戏,其中之一就是屏幕截图。 在本文中,我们将介绍使用Python进行屏幕截图的方法和技巧。 什么是屏幕截图? 屏幕截…

第六十八天学习记录:高等数学:导数(宋浩板书)

导数是微积分中的一个概念,描述了函数在某一个点上的变化率。具体地说,函数 f ( x ) f(x) f(x)在 x a xa xa处的导数为 f ′ ( a ) f(a) f′(a),表示当 x x x在 a a a处发生微小的变化 Δ x \Delta x Δx时, f ( x ) f(x) f(x)对…

Golang每日一练(leetDay0090) 运算优先级、有效字母异位词

目录 241. 为运算表达式设计优先级 Different Ways to Add Parentheses 🌟🌟 242. 有效的字母异位词 Valid Anagram 🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 …

Vector源码

介绍 Vector是矢量队列,继承于AbstractList,实现了List, RandomAccess, Cloneable和Serializable接口Vector继承了AbstractList,实现了List接口,所以它是一个队列,支持相关的添加、删除、修改、遍历等功能Vector实现了…

chatgpt赋能python:Python的强制语句缩进解析

Python的强制语句缩进解析 什么是语句缩进 在其他编程语言中,我们通过使用花括号或者一些其他的符号来区分控制语句的范围。但在Python中,我们使用缩进来实现这个目的。这意味着任何控制结构的主体都必须按照要求正确缩进。 为什么Python强制要求使用…

【Java】JavaWEB核心要点总结:63

文章目录 1. JSP 和 Servlet 有什么区别2. JSP有哪些内置对象 分别是什么3. 详细讲解cookie session token4. 如果客户端禁止 了cookie ,session 还能用吗5. session 的工作原理 1. JSP 和 Servlet 有什么区别 JSP(Java Server Pages)和Servl…

读改变未来的九大算法笔记06_图形识别

1. 人工智能研究人员在过去几十年中学到的最重要的教训之一 1.1. 看似智能的行为有可能从看似随机的系统中浮现出来 1.2. 如果我们有能力进入人脑,研究神经元之间连接的强度,其中绝大部分连接都会表现得很随机 1.3. 当作为集合体行动时,这…