给定的代码在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对象,因此必须初始化它以保存有用的值.
对原始特征的影响:删除语义明确定义的特征.
转换难度:语义转换.
如何广泛使用:很少.
R..*_*R.. 12
请注意,合法使用自动存储持续时间的未初始化的const限定对象:可以获取其地址并将其用作在递归函数中标记递归级别的唯一键.这有点模糊,但值得注意.C使这种使用效率很高,而C++则需要在初始化时浪费时间和代码大小.(理论上,编译器可能会确定该值从未使用过并优化了初始化,但由于您传递的是指针,因此很难证明.)
该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语言中完全合法.
| 归档时间: |
|
| 查看次数: |
5200 次 |
| 最近记录: |