C++中const的使用与编译器规则解析

需积分: 46 3 下载量 144 浏览量 更新于2024-09-28 收藏 48KB PDF 举报
"这篇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`在不同场景下的行为对于优化内存使用和保证代码安全至关重要。