typedef与#define和const的用法区分

C++中const与#define的深度对比:从原理到实战的全面解析 在C++编程中,常量定义是基础且高频的操作,理解不同类型常量的底层原理对编写健壮、高效的代码至关重要。从编译原理角度看,常量定义涉及预处理器的文本替换与编译器的类型化符号管理,这直接影响了程序的内存模型、作用域和调试体验。在技术价值上,类型安全的常量能有效避免低级错误,提升代码的可维护性,而编译期常量优化则能兼顾性能与安全性。在实际应用场景中,嵌入式开发、模板元编程、大型工程协作等都需要根据具体需求选择合适的常量定义方式。本文聚焦于C++中const与#define的核心差异,通过剖析预处理器宏的文本替换机 阅读详情

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

define为宏定义,它可以用来定义一个常量,常量的值为字符串或者数字,不可再更改。
define可以用作定义无参或者有参运算式,定义时运算式要加括号,否则会出错误。

define只是简单的文本替换
typedef是给一个类型重命名
当我们定义指针的时候,typedef要比define有优势

define工作在预编译时,进行简单的文本替换
define定义时,如果涉及到运算式,需要用括号括起
for example:
define f(x) ((x)*(x))

typedef工作在编译时,将数据类型重名命
typedef可以命名复杂的数据类型,我们常见的结构体类型,就常常和typedef结合起来使用
for example:

typedef struct tagMyStruct
{
int iNum;
long lLength; 
}MyStruct;

实际上执行两个操作,一个是定义了结构体tagMyStruct,注意这是一个临时的名字

struct tagMyStruct
{
int iNum;
long lLength;
};

而typedef为这个结构体起了一个新名字

typedef struct tagMyStruct MyStruct;

如果我们要定义指针

typedef char* pStr1;

#define pStr2 char* 

pStr1 s1,s2;

pStr2 s3,s4;

在这里,s1,s2,s3都被定义为char*,s4为char类型,正确的写法应该是

pStr2 s3,*s4;

还有一例:

typedef char *pStr;
char string[4]="abc";
const char *p1=string;
const pStr p2=string;
p1++;
p2++;

如果我们执行会报错

$ gcc typedef_pointer.c -o typedef_pointer
typedef_pointer.c: In function ‘main’:
typedef_pointer.c:11:5: error: increment of read-only variable ‘p2’
p2++;
^

这是因为p2是一个只读常量,它是不可变的。const用于限定一个变量为只读变量(和常量的概念不同),const char* p1限定了p1指针为只读,*p1不可改变,但是p1是可以变的,故p1++不报错。

const pStr p2并不等于const char * p2,和pStr const p2作用相同,它限定了p2是只读变量,只不过类型是我们自己定义的pStr,故p2++报错。
const type M,这句话表明M被限定为只读变量,不可当常量使用,这是ANSI C的标准,与C++标准有不同之处。

C/C++类型别名:从#define到using的演进与实战指南 在C/C++编程中,类型系统是编译器在编译期发现错误的核心机制。其原理是通过为数据赋予明确的类型信息,使编译器能够进行类型检查,从而避免隐式转换错误和内存访问违规。这一机制的技术价值在于提升代码的健壮性、可读性和可维护性,尤其在嵌入式开发、系统编程等对稳定性和性能要求高的领域至关重要。应用场景广泛,从硬件寄存器访问、平台无关整数定义,到简化复杂模板和定义回调接口,都需要合理的类型抽象。本文聚焦于类型别名的实现方式,深入对比#define、typedef和using三种机制,其中#define因其文本替换特性 阅读详情

相关推荐

【编译原理】LL(1)分析方法 生成语法树(c++实现)

基本流程 输入文法->消除左递归->提取左公共因子->求FIRST集->求FOLLOW集->LL(1)分析表->表驱动的预测语法分析过程->输出语法分析结果和语法树

qq_43417265的博客 1万+

const与define的区别

1、define是预编译指令,const是普通变量的定义,define定义的宏是在预处理阶段展开的,而const定义的只读变量是在编译运行阶段使用的。 2、const定义的是变量,而define定义的是常量。define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量,系统只会给变量分配内存。但const定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元。可以说,常变量是有名字的不变量,而常量是没有名字的。有名字就便于在程序中被引用,所以从使用的角度看,除了不能作为数组的长度

AKE_XBZ的博客 1万+

ROS基础(一)——命令行代码(以小乌龟程序为例)

ROS学习(一)——命令行代码(以小乌龟程序为例)1 基础命令行语句1.1 roscore1.2 rqt_graph(显示系统计算图)1.3 rosnode(显示所有节点相关信息)1.4 rostopic(和话题相关)2 服务类型指令rosservice同时存在两只海龟3 指令记录 1 基础命令行语句 从大二四旋翼无人机编队后就没再接触过ROS了,最近由于科研任务需要重新捡起来,打算系统学一下!学习过程参考古月居老师的视频,有兴趣的同学可以去[BliBli]学习。 学习平台:Ubuntu 18.04 硬件

北理自动化小白 6267

const 和 define 之间的区别

const 在C 语言中表示只读,编译器禁止对它修饰的变量进行修改,在C++ 中增加了常量的语义。3.用define 定义的常量是不可以用指针变量去指向的,用const 定义的常量是可以用指针去指向该常量的地址的;2. define 只是简单的字符串替换,没有类型检查,而const 有对应的数据类型,编译器要进行。4. define 不分配内存,给出的是立即数,有多少次使用就进行多少次替换,在内存中会有多个。拷贝,消耗内存大,const 在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝;

yyy____________的博客 1454

解决SolidWorks启动报错问题:SolidWorks2020显示无法获得下列许可 SolidWorks standard 期望的SolidWorks监控程序已经关闭(-97,121,0)

解决SolidWorks启动报错问题:SolidWorks2020显示无法获得下列许可 SolidWorks standard 期望的SolidWorks监控程序已经关闭(-97,121,0) 问题描述 打开SolidWorks2020时,显示SolidWorks2020显示无法获得下列许可 SolidWorks standard 期望的SolidWorks监控程序已经关闭(-97,121,0) (急需看模型的我心里万马奔腾…) 截图如下: 有问题咱就上 看了其他博主的回答,自己尝试了几个,发现出现了新的

qq_44606358的博客 7万+

基于STM32设计的智能防盗单车锁_349

本设计基于STM32F103RCT6单片机,研制了一种适用于户外环境的智能防盗单车锁系统。系统集成了GPS定位模块、ADXL345加速度传感器、4G通信模块(Air780E)、OLED显示屏、继电器模拟锁控模块等硬件,通过姿态感知实现车辆异常移动检测,在锁车状态下自动触发蜂鸣器报警并通过短信与APP通知用户。

867

关于typedef的用法(未读)(此文极好)

 转贴 关于typedef的用法2007-04-04 17:20 关于typedef的用法 一.基本概念剖析 int* (*a[5])(int, char*);  

thimin的专栏 1675

C++面试八股文

和静态多态(又称编译期多态,即在系统编译期间就可以确定程序将要执行哪个函数),其中动态多态是通过虚函数实现的,虚函数是类的成员函数,存在存储虚函数指针的表叫做虚函数表,虚函数表是一个存储类成员虚函数的指针,每个指针都指向调用它的地方,当子类调用虚函数时,就会去虚表里面找自己对应的函数指针,从而实现“谁调用、实现谁”从而实现多态。而C++符号表中的符号不是以函数名命名的,称为函数名修饰规则,虽然函数名相同,但是函数参数等其他属性不同,取的符号也不同,所以不会产生查询歧义的问题,使得函数可以重载。

qq_46676829的博客 905

C语言const:禁止修改变量的值

有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定。例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小。为了满足这一要求,可以使用const关键字对变量加以限定: const int MaxNum = 100; //班级的最大人数 这样 MaxNum 的值就不能被修改了,任何对 MaxNum 赋值的行为都将引发错误: MaxNum =

aeoluspu的专栏 1351

水文仿真软件:SWMM (Storm Water Management Model)_(6).地理信息系统(GIS)与SWMM数据交换

地理信息系统(GIS)与SWMM数据交换是水文仿真中的一个重要环节。通过合理的数据准备、导入、导出和校验,可以确保模型的准确性和实用性。本文介绍了使用SWMM GIS Add-on和Python脚本进行数据交换的方法,并提供了一些优化建议和常见问题的解决方案。希望这些内容能帮助读者更好地进行GIS与SWMM的数据交换,提高水文仿真的效率和质量。

kkchenjj的博客 579

PHM2010刀具磨损预测完整实现

本文介绍了PHM2010刀具磨损预测项目的完整实现方案。项目采用PHM2010公开数据集,包含6个子数据集,记录了铣削加工过程中7个通道的传感器数据(切削力、振动和声发射信号)。技术路线包括数据预处理(截取中间10万点、小波降噪)、特征提取(时域9个、频域4个特征)、特征融合和皮尔逊相关系数筛选,最终使用BiLSTM模型进行训练和评估。环境配置基于Python 3.9,依赖NumPy、Pandas、PyTorch等库。数据加载和预处理阶段重点处理了传感器信号分段和磨损标签对齐问题,为后续建模奠定基础。

huanghm88的专栏 422

Typedef、 Const、#define三者的区别和联系

修饰的是这个指针指向的内容不允许修改,这个指针的地址可以改变。错误:在c语言中n并不是真正意义上的常量,它还是变量 ,对于数组来说必须要开辟一个准确的数组大小,C++中是可以编译过去。修饰的指针,表示这个指针的地址不可以修改,地址的内容可以修改。//这样也是错误的,数组必须是确定的。是一样的都是修饰变量a为常量。//a是int * a, b是 int* b。//a是int * a, b是 int b。补充:int *p,q表示p是指针变量,q是int变量。

controlourself的博客 535

010、Zephyr RTOS开发环境搭建(Docker)

摘要 本文分享了使用Docker搭建Zephyr RTOS开发环境的实践经验。作者通过团队新人配置环境的真实案例,指出传统安装方式存在版本冲突、缓存污染等问题,而Docker方案能确保环境一致性。文章详细介绍了自定义Docker镜像的设计思路,重点解决工具链版本匹配、Python虚拟环境隔离等问题,将镜像体积从2GB优化到800MB。提供了从拉取镜像到点亮LED的完整工作流程,并总结了USB设备直通、文件权限、缓存问题等常见陷阱。还探讨了多阶段构建、CI集成等进阶用法,同时客观分析了Docker方案的局限性

m0_50546716的博客 80

C语言关键字volatile、static、const、extern详解

告诉编译器,被修饰的变量可能会被意外地修改,编译器不应该对访问该变量的代码进行优化(如将变量缓存到寄存器中),每次访问都要从内存中读取变量的最新值,以确保程序能正确反映变量的真实状态。修饰的局部变量存储在静态存储区,其生命周期从程序开始到结束,不会在函数调用结束后被销毁,且只会初始化一次。修饰的全局变量,其作用域被限制在定义它的源文件内,其他源文件无法访问该变量。修饰的函数,其链接属性变为内部链接,意味着该函数只能在定义它的源文件中被调用,其他源文件不能调用此函数,同样可以减少命名冲突。

2201_75650603的博客 318

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

c语言中常见的一些坑和一些细节(建议收藏)

博主接下来将会整理一些语言中常见的问题和坑,再看博主解释的时候可以自己思考一下 1.变量的声明和定义有什么区别? 答:变量的定义为变量分配地址和存储空间,变量的声明不分配地址。 一个变量的可以在多个地方声明,在只能在一个地方定义。加上extern修饰的是变量的声明,说明将这个变量在文件后面定义或者在文件以外 说明: 很多时候一个变量,只是声明不分配内存空间,直到使用时才初始化,分配内存 for example:外部变量 #include<stdio.h&gt...

qq_56999918的博客 1898

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C语言 入坑总结

内存泄漏是指计算机程序在使用内存时,没有正确释放不再需要的内存,导致系统中的可用内存逐渐减少,最终可能导致程序性能下降或崩溃。泛型指针是指void类型指针,它可以指向任何类型的数据。悬挂指针是指已经指向了一个对象或变量,但该对象或变量已经被释放或销毁,使得指针指向的内存区域不再有效。free(ptr);// 现在 ptr 是一个悬挂指针*ptr = 42;// 访问悬挂指针的值,可能导致未定义的行为野指针是指一个未被初始化的指针,它包含一个随机或无效的内存地址,没有明确指向任何有效的对象或变量。

Gefangenes的博客 865

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

一篇文章让你彻底区分#define和typedef

本文深入分析了C/C++中#define和typedef的本质区别与使用场景差异。#define是预处理阶段的文本替换,不进行类型检查,可能导致指针声明错误、类型不匹配等问题;typedef则是编译阶段的类型别名定义,具有严格的类型检查。主要区别体现在:1)指针连续声明时#define可能产生意外结果;2)与const结合使用时语义不同;3)作用域规则不同;4)类型检查机制差异;5)typedef更适合封装复杂类型。文章通过代码示例和编译测试详细对比了两者的特性,建议根据实际需求选择合适的类型定义方式。

分享一些嵌入式Linux相关知识 428

#define 、const 、typedef 诠释

1,符号亮量、预处理指令 #define PI 3.1416 //注意行末没有分号 在对程序进行编译前,预处理器先对PI进行处理,把所有的PI全部置换为3.1416。 #define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。 注意:要区分...

tyler880的专栏 230

typedef 和 #define的用法和区别

typedef 和#define 都可以用来给类型或变量取别名,但两者仍有很大区别: 处理阶段不同:define是预处理,在比编译预处理时进行替换,但不做正确性检查,不管含义是否正确,只做简单的替换,只有在后面的编译阶段才可能发现错误。 typedef 是c语言中的关键字,在编译阶段检查处理的。它可在自己的作用域内对已存在类型取别名,但不可在函数内 #define是预处理指令,在编译预处理生成.i...

博客小站 389

C语言#define与typedef核心差异与应用实践

在C语言开发中,类型系统和代码抽象是提升工程质量的关键。typedef作为类型别名机制,在编译阶段进行类型检查,能有效增强代码可读性和跨平台能力;而#define作为预处理指令,通过文本替换实现代码生成,但缺乏类型安全。理解指针定义、const修饰等场景下的行为差异,对嵌入式开发和系统编程尤为重要。通过结构体简化、跨平台类型定义等实践,可以构建更健壮的类型系统。合理运用这两种特性,能显著提升代码的可维护性和可移植性,是嵌入式开发者必须掌握的核心技能。

weixin_31176789的博客 510

【C语言笔记】#define与typedef的区别

1、#define define是预处理指令,在编译时不进行任何检查,只进行简单的替换 宏定义的一般形式为: #define 宏名 字符串 这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同,它不需要双引号。 2、typedef typedef是在C语言中用来为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与auto、extern、mutable、static、r...

ailai63548的专栏 225

结构体定义:struct与typedef struct 用法详解和用法小结

一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。  二、#define的用法

wangshengfei 769

typedef、#define、const用法和注意点。

typedef: (http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html) 用法: 1.定义一个类型别名,便于直观识别,另外注意不是简单的宏替换,如下: typedef PTD1 int*; #defien PTD2 int* PTD1 a,b; PTD2 a,b; ...

weixin_30437481的博客 144

宏、typedef、const

宏#define 宏的本质:替换而已。eg. #define PI 3.1415 宏与const在定义常量时的区别:前者只是把常量替换到源文件中,因此编译调试时会出现具体的数字而宏的名称不会出现在符号表中容易给调试带来麻烦;而后者不会有此问题 typedef typedef定义类型的别名。eg. typedef int* p;       typedef int (*PFUNC)(in

Pop_Rain的博客 409

结构体定义 struct与typedef struct 用法详解和用法小结

一、typedef的用法   在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。    二、#def

lgstudyvc的专栏 1176
上一篇: Git学习笔记 chapter05--添加远程仓库并同步
下一篇: 记录C/C++的几个标准以及main()函数的使用
void_lxy
博客等级 码龄11年 11粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值