《我对const修饰符应用的理解》读后感--const关键字的非主

来源:互联网 发布:php商城源码下载 编辑:程序博客网 时间:2024/05/18 06:23

读了李羽同学的《我对const修饰符应用的理解》,觉得还应该有所深入,于是就写了这个笔记。

以下是dave的理解:

const关键字在C语言中的作用仅仅是限定 不可以通过const变量来修改内存数据,但是可以通过别的方式,例如指针指向const变量然后再修改内存中的值。
但对于const关键字的优化gcc和g++的处理还有些不一样(以下对C/C++的描述可缩小范围为gcc/g++的描述)。
例如以下代码:

Code:
  1. #include <stdio.h>  
  2.    
  3. int main()  
  4. {  
  5.     const int a = 100;  
  6.     int *p = (int *)&a;  
  7.     (*p)=1;  
  8.     printf("%d",a);  
  9.     return 0;  
  10. }   


在gcc下编译运行通过,输出1。
在g++下编译运行通过,输出100。调试过程中发现在printf("%d",a);这句的时候没有从内存中读取a的值,而是直接用100这个字面常量。这就是const关键字优化的结果,如果定义的时候换成volatile const int a = 100; 用volatile关键字限定的话就输出的1。
但是使用O2开关优化的时候,采用gcc/g++ (GCC) 3.4.5 (mingw-vista special)时 ,无论gcc还是g++都是输出100,加了volatile关键字也不起作用了。在gcc/g++ (GCC) 4.3.2 20081105 (Red Hat 4.3.2-7)中只要加入volatile,输出就是1。看来不同版本的编译器,不同的系统还有不一致的情况。所以这个结果提醒我们,不要试图修改const变量值,保不准会出现什么问题