CPP与C中的const

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提前取消宏。
posted @ 2022-06-17 11:07  肖肖凯  阅读(208)  评论(0)    收藏  举报