【发布时间】:2016-05-11 18:20:27
【问题描述】:
我不明白为什么这样做是错误的:
const int n = 5;
int x[n] = { 1,1,3,4,5 };
即使n 已经是一个常量值。
虽然这样做似乎适合 GNU 编译器:
const int n = 5;
int x[n]; /*without initialization*/
我知道 C99 的 VLA 功能,我认为它与正在发生的事情有关,但是 我只是需要澄清一下背景中发生的事情。
【问题讨论】:
-
我怀疑如果你在
n的定义上加上static,它会起作用;static const将是真正的全局编译时间常量,而不是堆栈存储常量。 -
@ShadowRanger:C 不是 C++。
const的语义是区别之一。 C 没有符号常数。例如。1是 C 标准中的 整数常量。const int i仍然是一个变量! -
const只是一个承诺你给编译器你不会直接或间接更改变量。对于第一个大多数编译器会发出警告,对于后者(例如通过指针),它们在检测所有可能的违规行为方面非常有限。如果您违反合同,您将调用未定义的行为。 -
@Olaf,C 有 一些 符号常量,您可能不会想到它们,即枚举。
-
@JensGustedt:是的,我总是忘记那些。它们是一些特殊的类型,主要是因为您不能显式指定它们的类型(C11 也应该从 C++11 复制一些东西,使
enums 最终有用)。还有两个“布尔”常量_True和_False,它们不是用户可定义的。嗯,正如您所写的“即”,这意味着还有其他人:我忘记了任何其他用户可定义的符号常量吗? (严肃的问题,我可能忽略了一些简单的事情——如果你在树林里,你只会看到树)