C中的const与C++中的const

Ser*_*gii 12 c c++ const

给定的代码在C中编译但在C++中失败.

int main()
{
   const int x; /* uninitialized const compiles in C but fails in C++*/
}
Run Code Online (Sandbox Code Playgroud)

从C到C++的变化背后有什么理由和原因?

Joh*_*itb 14

请参阅兼容性附录C.1.6中的规范:

7.1.6 [另见3.5]

更改: const对象必须在C++中初始化,但可以在C中保持未初始化

基本原理:无法分配const对象,因此必须初始化它以保存有用的值.

对原始特征的影响:删除语义明确定义的特征.

转换难度:语义转换.

如何广泛使用:很少.

  • @Yury它不能.这是未定义的行为. (2认同)

R..*_*R.. 12

请注意,合法使用自动存储持续时间的未初始化的const限定对象:可以获取其地址并将其用作在递归函数中标记递归级别的唯一键.这有点模糊,但值得注意.C使这种使用效率很高,而C++则需要在初始化时浪费时间和代码大小.(理论上,编译器可能会确定该值从未使用过并优化了初始化,但由于您传递的是指针,因此很难证明.)


Die*_*Epp 5

const关键字于1989年在C89中引入C,但自1983年创建以来一直使用C++.因此它从C++"反向移植"到C.

初始化语义在C和C++中通常是不同的.虽然大多数时候他们"只做你期望的事情",但有些情况下差异变得非常重要.毕竟C++真的不是C的超集.

例如,在C++中你不能:

goto x;
int i = 3;
x:
puts("Hello, world");
Run Code Online (Sandbox Code Playgroud)

但这在C语言中完全合法.

  • 不会因为它有趣(并且正确)而进行downvote,但它并没有完全回答这个问题. (5认同)