我试着写了一个c程序如下?
const int x = 5;
int main()
{
int arr[x] = {1, 2, 3, 4, 5};
}
当我尝试使用 gcc 进行编译时会发出警告,如下所示。
simple.c:9: error: variable-sized object may not be initialized.
但在 C++ 中也是允许的。当我将 x 作为数组大小传递时,为什么 x 不被视为常量?
最佳答案
在 C 中,const
并不意味着“常量”(即在编译时可计算)。它仅表示只读。
例如,在一个函数中,这个:
const int r = rand();
const time_t now = time(NULL);
完全有效。
定义为const int
的对象的名称不是常量表达式。这意味着(在 C99 之前的 C 中,以及所有版本的 C++ 中)它不能用于定义数组的长度。
尽管 C99(以及可选的 C11)支持可变长度数组 (VLA),但它们不能被初始化。原则上,编译器在定义 VLA 时并不知道它的大小,因此它无法检查初始化程序是否有效。在您的特定情况下,编译器很可能能够弄清楚,但语言规则旨在涵盖更一般的情况。
C++几乎是一样的,但是C++有一个C所没有的特殊规则:如果一个对象被定义为const
,并且它的初始化是一个常量表达式,那么对象的名称它本身是一个常量表达式(至少对于整数类型)。
C 没有采用此功能并没有很好的理由。在C中,如果你想要一个整数类型的名称常量,通常的做法是使用宏:
#define LEN 5
...
int arr[LEN] = {1, 2, 3, 4, 5};
请注意,如果您更改 LEN
的值,则必须重新编写初始化程序。
另一种方法是使用匿名枚举
:
enum { LEN = 5 };
...
int arr[LEN] = {1, 2, 3, 4, 5};
枚举常量的名称实际上是一个常量表达式。在 C 中,由于历史原因,它始终是 int
类型;在 C++ 中它是枚举类型。不幸的是,这个技巧只适用于 int
类型的常量,因此它仅限于 INT_MIN
到 INT_MAX
范围内的值。
关于c++ - 为什么数组的大小作为常量变量在 C 中是不允许的,而在 C++ 中是允许的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25902512/