const关键字如何在c中工作

mou*_*sey 9 c c++

我想知道c和c ++中的const内部.编译器如何强加常量?有谁可以帮助我吗.

bma*_*ies 21

一般const是100%编译器.当你声明一些const时,编译器会限制你可以编写的内容.它不会让你分配给const标量,通过const引用或或指针赋值,或者调用const对象的非const函数.

无法保证编译器会安排任何类型的运行时保护.

  • @Eli究竟有人投票给FQA链接...更好地阅读有关const-correctnes的常见问题解答:http://www.parashift.com/c++-faq-lite/const-correctness.html.减少咆哮,更多物质 (4认同)
  • 很好的答案.对于有兴趣进一步阅读的人,我建议C++ FQA关于const正确性的部分:http://yosefk.com/c++fqa/const.html (3认同)
  • @Johannes:我实际上不同意FQA关于C++的基本结论,我很乐意在我的日常工作中使用C++,但我觉得FQA可以是富有洞察力和发人深省的,阅读它有助于我理解我运行的一些问题在编写C++时远比FAQ好得多.此外,FQA会在每个问题中直接链接到常见问题解答,因此很容易看到原始答案.我可能应该添加一个免责声明,FQA可能不是新手程序员的好资源,他们应该坚持使用FAQ. (2认同)

AnT*_*AnT 10

const C和C++中的关键字有两种不同的语义含义.

(1)它可以声明对象的常量

const SomeType t;
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,对象t是一个不可修改的对象.编译器将尽力阻止您通过观察const-correctness规则(在C和C++中不同)来修改它.const-correctness规则仅在概念上强制执行,在语言级别,这意味着有办法绕过这些规则,这也意味着对象的constness不一定在物理层面实现.即,不能保证对象最终将被放置在只读存储器中.

重要的是要注意,这种常量在某种意义上是不可移除的,因为任何通过抛弃const修改上述对象的尝试都会导致未定义的行为(mutable在C++中排除可能的成员).

(2)它可以声明对象访问路径的常量

const SomeType *p;
Run Code Online (Sandbox Code Playgroud)

以上内容p被声明为指向const的指针.这并不一定意味着对象p指向的是一个常量对象(由const上面的第一种定义).它可能很容易成为一个非常数的,在这种情况下,抛弃上述访问路径中的常量并修改对象是完全合法的,尽管它通常不是一个好的编程实践.换句话说,访问路径的常量可能是可移除的.

考虑到上述因素,以下声明

const int* const* const* const p = 0;
Run Code Online (Sandbox Code Playgroud)

包括两种不同的类型const:最后一个const声明对象的常量p(第一种),而其余的const声明由p(第二种)表示的各种级别的访问路径的常量.

PS作为一个[可能无关的]侧面注释,值得注意的是,术语常量在C和C++中具有截然不同的含义.在C++中,常量是声明为的对象const.在C 常量中是文字.声明为的对象在C术语const中不是常量.


Voi*_*oid 5

除了通过使用const问题的其他答案已经提到的关键字提供的编译时强制不变性之外,使用它有时还允许编译器将此类数据放置在二进制文件和内存的只读部分中。根据constUlrich Drepper 的文章《如何编写共享库》中的第 2.4.2 节“永远” ,这样做可能允许程序 (1) 使用更少的资源和 (2) 启动更快。

请注意,像往常一样,丢弃const此类只读内存区域中的数据会导致未定义的行为。