c++ - 为什么数组的大小作为常量变量在 C 中是不允许的,而在 C++ 中是允许的?

标签 c++ c

我试着写了一个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_MININT_MAX 范围内的值。

关于c++ - 为什么数组的大小作为常量变量在 C 中是不允许的,而在 C++ 中是允许的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25902512/

相关文章:

c - 在两个表之间分配数字的问题

c - 我需要 C 程序方面的帮助

c++ - 如何计算 Lucas Kanade 流

c++ - 使用 G++ 强制链接到 pthread

java - 用于流量控制的 Log4X

c++ - 数组结构的 MPI-3 共享内存

c++ - 将新对象作为默认参数传递给构造函数

c - 如何使这段代码形成的金字塔(CS50马里奥程序)右对齐?

c - 这个将元素添加到链表的函数有什么问题?

c - 在 C 中使用宏生成函数