const
个变量意味着uninitialized const variable
是不可能的&这是一个编译器错误。但为什么C语言也不一样呢?
考虑以下编译精细C的程序:
#include <stdio.h>
int main()
{
const int a;
}
允许uninitialized const
的原因是什么?如果C也遵循与C ++相同的规则,那会不会很好?是否由于性能问题,每次调用函数时都需要初始化局部const变量&amp;初始化需要时间吗?
答案 0 :(得分:3)
历史。
const
从一开始就在C ++中指定,并且使用符合该语言的目标。 const
后来在C中指定,但具有相关但不同的含义,以最大限度地减少现有的C代码兼容性问题。
由于C开始时没有const
,因此后来的包含更像是read-only
修饰符,而不是constant
修饰符。这使得现有编译器必须将const
作为 nothing 来写入const
未定义的行为。较新的编译器/代码可以利用const
提供的优势。
const int a;
a = 5; // problem in C as code attempts to write `a`
// Really should be `const char *fred`, but allowed for backwards compatibility.
char *fred = "sally";
C ++采取了更强大的方法并要求初始化。
答案 1 :(得分:3)
除了其他方面,差异可能源于一种更为宽松的C语言初始初始化方法,不仅仅是const
个对象。例如,此代码在C ++中是非法的
goto over;
int a = 5;
over:;
因为它跳转到a
的范围绕过其初始化。同时在C中,此代码完全合法,变量a
在over:
处具有不确定的值。
同样的逻辑适用于您的const int a
声明。 C语言只是认为未初始化的对象并不是什么大问题,即使在以后再也无法将其设置为确定值的情况下。
C ++中更严格的初始化要求的主要原因是在语言中引入了非平凡的初始化(构造函数),即无法有意绕过的初始化。标量对象及其在C ++中的初始化只是标记为更广泛概念的一小部分。
如果C也遵循与C ++相同的规则,那会不会很好?
我没有看到它。 C和C ++是完全不同的语言。而且他们对const
的处理也完全不同。
答案 2 :(得分:1)
因为C对程序员非常有信心并且允许他做很多事情,包括愚蠢的事情:int *x = NULL; x[4] = 12;
将被编译而没有错误,甚至没有许多编译器的警告。
更确切地说,const
只是程序员不应该修改变量的承诺,并且如果可以帮助优化,编译器可以将其视为常量。但编译器永远不会强制执行任何运行时规则来禁止更改const值:
const a = 1;
int *ix = (int *) &a;
*ix = 2;
printf("a=%d\n", a); /* UB : could print 1 or 2 */
将在没有警告的情况下编译。但是它会调用未定义的行为,因为你修改了一个声明为const的对象。
我认为不允许初始化const变量只是因为当前的C规范并不禁止它!在以前的版本中,初始化始终是可选的。也许未来版本可能会强制自动变量初始化
无论如何,全局或静态const变量实际上是自动初始化的(根据C语言规范6.7.9 10):如果没有初始化具有静态或线程存储持续时间的对象 显式,然后:...如果它有算术类型,它被初始化为(正或无符号)零; ... 的
如果static const a;
是全局的const a
,那么a
完全有效a=0
。
答案 3 :(得分:0)
我认为原因是惯例。
在C中,几乎没有任何类型的对象需要被初始化,并且从未需要被初始化。
const
个对象只是一种具有一个特殊特征的对象,为什么要为它们做例外?