const全局变量
- cpp和c中的const全局变量都是放在常量区的,因此一定是不可以修改的
- 但是C语言中const全局变量默认是外部链接的,即可以跨文件使用,在一个文件里
const int a = 10
,在另一个文件中可以直接extern const int a
声明一下即可使用。
- CPP则默认是内部链接,即作用域限定在本文件内,如果非要跨文件使用则在定义的时候就要用
extern
声明一下来提升作用域。即定义的时候就是extern const int a = 10
,使用的时候还要声明extern const int a
。
const局部变量
- C语言中的const局部变量是可以通过指针来间接修改的,此时const局部变量在栈区。
void test(){
const int m_B = 20;
int *p = (int *) &m_B;
*p = 100;
}
- 同样的代码,C++中的const局部变量不能通过指针间接修改。因为cpp中不会给const局部变量分配内存,而是将其放入一个符号表中,即每次使用m_B时,都是到符号表中去找。而当使用
int *p = (int *) &m_B
时,编译器会临时开辟一块内存空间,即int tmp = m_B; int *p = (int *)&tmp;
,因此*p = 100
修改的是这一块临时空间的值,而不是原const局部变量的值。
void test(){
const int m_B = 20;
int *p = (int *) &m_B;
*p = 100;
}
![]()
![]()
- 由于C语言中的const局部变量可以间接修改,因此是伪常量,不能用来初始化数据,即
int arr[m_B]
报错。但是cpp中的const局部变量可以认为是真正的常量,是可以用来初始化数组的。
CPP中const局部变量内存分配情况
- 一般的const局部变量(直接用常量初始化的)是不分配内存的,即直接放到符号表中,因此是没办法修改的。
- 但是如果用变量初始化const局部变量的话,即
const int a = b
,这时候不管b是基本数据类型还是自定义数据类型,都会分配内存,即可以通过指针间接修改。
尽量用const常量代替宏常量
- 宏常量名字在预编译阶段就是会替换,因此万一遇到错误难以看懂错误信息。
- 宏常量无类型,const有类型,可以进行编译器类型安全检查。
- const有作用域,#define从定义到结尾都有效,除非用#undef提前取消宏。