C-C语言中的const实现机制

C-C语言中的const实现机制

泛泛之交 发布于 2017-01-04 字数 55 浏览 1158 回复 7

一直很好奇const int a是如何做到让变量a只读的呢?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

泛泛之交 2017-11-07 7 楼

const修饰属于编译层面的限制。一般不会涉及到运行层面。
但是对于c/c++程序员来讲,最重要在于理解const是用来做接口设计的,
正确使用const可以明确传递给调用者或维护者信息,告诉他们这个变量和
函数是不能修改,否则就是违背设计的初衷。通过编译层面的防错来构建
设计的约束这才是const的用处。

补充:
如果你用memset去修改所谓const变量的内容,发现没有任何问题,结合上面所述就能
明白const到底是做什么的。

偏爱自由 2017-10-20 6 楼

编译的时候,编译器进行语法检查可以发现变量的使用是否出现违反const的情况。出错就会报错。
在链接成DLL或者EXE后,也有可能让变量是只读的。在PE的标准中,有一个section,通常的名称是.rdata,这个节内的数据就是只读数据。在运行的时候这块内存设置成只读,不能写,就达到了const的要求

夜无邪 2017-10-13 5 楼

const修饰只在编译层,代码中违反const的行为被禁止。但const变量的存储跟普通存储并没用区别,是可以修改const值的。

想挽留 2017-10-12 4 楼

编译器直接把变量a替换成常量了

浮生未歇 2017-10-10 3 楼

1 const是语法保留字,是编译器或解释器处理的,代码中违反const的行为会被它们禁止(报错);
2 编译器会把const修饰的变量放在系统的不可修改的存储位置吧,这个可由OS来加以限制(底层方面了解不多)。

泛泛之交 2017-08-11 2 楼

const类型的和没有声明为const类型的编译后的结果是相同的。可以看下const char *a="111";和char *a="111";在反汇编代码中是一样的,都是如下结果:

但如下代码:
const char *a="111";
*a="222";

编译器会报错:
error C2440: '=' : cannot convert from 'char [4]' to 'const char' This conversion requires a reinterpret_cast, a C-style cast or function-style cast

所以只是编译器编译时进行了限制。

归属感 2017-02-06 1 楼

const 修饰的变量和不带const修饰的变量主要是存储的位置不同,const是在只读区中,而不带const 是放在普通的内存中。