
C++中const的使用与编译器规则解析
下载需积分: 46 | 48KB |
更新于2024-09-28
| 161 浏览量 | 举报
收藏
"这篇PDF文件由Dan Saks撰写,探讨了C++中`const`关键字的多种用法,特别关注了在编译器如何将数据放入只读存储区(ROM)时的规则。作者通过电子邮件回复了Phil Baurer在使用Hitachi C编译器时遇到的一个关于`const`与`typedef`结合的问题。问题在于,使用`typedef`定义的`const void*`指针数组被链接器放置到CONSTANT部分,而直接定义的`const void*`数组则被放置到DATA部分。"
在C++中,`const`关键字有多种用途,包括声明常量、常量指针和指针常量等。首先,`const`可以用来声明变量为常量,这意味着一旦赋值后,就不能再改变。例如,`const int x = 5;`声明了一个不能修改的整型变量x。而`const`与指针结合时,其行为有所不同:
1. `const`修饰指针:这表示指针所指向的数据是不可变的。例如,`const int *p`表示p是一个指向常量整数的指针,不能通过p来修改该整数的值。
2. `const`修饰指针本身:这表示指针变量本身是不可变的,即它的地址不能改变。例如,`int * const p = &x;`声明了p是一个指向x的常量指针,意味着p的值(即它所指向的地址)不能改变,但可以通过p修改x的值。
3. `const`同时修饰指针和指针所指的数据:`const int * const p = &x;`表示p是一个指向常量整数的常量指针,即p的值和它所指向的整数都不能改变。
在Phil Baurer的问题中,他遇到了不同编译结果。这是因为C++标准允许编译器根据上下文决定`const`对象的存储位置。在第一种情况(1)中,`typedef void* VP; const VP vectorTable[]`,`vectorTable`是一个`const void`指针类型的数组,`const`修饰的是类型别名`VP`,因此数组中的每个元素都是不可变的指针,它们被视为只读数据,所以链接器将其放入CONSTANT部分。
而在第二种情况(2)中,`const void* vectorTable[]`直接声明了一个`const void*`类型的数组,这里的`const`修饰的是整个数组,表示数组本身是常量,但不禁止修改数组元素所指向的数据。由于数组不是初始化为只读数据,链接器将其放入DATA部分,这通常是可写数据的存储区域。
这种行为符合C++标准,并非编译器错误。在嵌入式系统中,这种对`const`对象的处理方式至关重要,因为只读数据通常会被烧录到ROM中,而可写的DATA则存储在RAM中。理解`const`在不同场景下的行为对于优化内存使用和保证代码安全至关重要。
相关推荐









Aji78
- 粉丝: 8
最新资源
- ISB开发设计文档:规范化软件开发参考资料
- 掌握Delphi:高效开发Windows应用的可视化编程教程
- Oracle 11g数据库全方位参考指南
- JavaScript与XML结合Flash技术在网页新闻和商品展示中的应用
- RS232转USB万能驱动:解决无串口笔记本数据传输难题
- Graphics32 1.5.1版安装及变更指南
- 书吧电子书制作V1.0:轻松制作JAR格式电子书
- 掌握Microsoft Make CAB工具的使用技巧
- 英文版CSS教程PPT:适合初学者的学习资源
- depends22: 探索C++函数深度的查看工具
- 初学者指南:幸运52游戏的VC++实现教程
- FlashUploadWeb图片上传下载功能的实现与优化
- 深入解析计算机硬件技术基础与电子教案
- C++实现HeadFirstDesignPatterns代码深度解析
- C++内存映射技术实现共享资源的编程方法
- C语言实现的DES算法与命令行演示工具
- 词法分析器与语法分析器全面解决方案
- C#多线程实践:BackGroundWorker控件应用示例
- GDF4.0培训中文版详解及文件架构
- ASP+ XML-MS SQL 可重用动态滚动条解决方案
- BatchUnRar: 自动识别分卷RAR文件的批量解压神器
- 应用程序与驱动程序事件同步机制研究
- VB课程设计:机票销售系统的实现与数据库管理
- JSTL实例源码深度解析与应用