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

发布于 2017-01-04 20:04:34 字数 37 浏览 1281 评论 7

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

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

评论(7

泛泛之交 2017-11-07 18:01:29

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

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

偏爱自由 2017-10-20 19:44:47

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

夜无邪 2017-10-13 08:19:09

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

想挽留 2017-10-12 10:11:43

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

浮生未歇 2017-10-10 22:54:44

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

泛泛之交 2017-08-11 10:21:14

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 19:00:14

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文