C++ 可变大小对象可能未初始化

C++ variable-sized object may not be initialized

我有以下简单的来源

#include <iostream>

int main() {
    int nv;
    nv = 3;
    int arr[nv] = { 0, 2, 5 };
    return 0;
}

在系统 1 上使用 GCC 编译时,我得到

error: variable-sized object ‘arr’ may not be initialized.

在系统 2 上使用 GCC 编译时没有出现任何错误。

两种情况下的编译标志相同,见下文。

这是什么原因,我怎样才能让我的代码在系统 1 中编译? 我怀疑是和gcc版本有关,但是我没有找到任何资料支持这个怀疑。

在系统 1 中:

$ g++ --version
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
...
$ make
g++ -MMD -g -g3 -Wall -Wunused -Wuninitialized -Wextra -fmessage-length=0 -std=gnu++11 -c -o obj/arrays_test.o src/arrays_test.cc
...

在系统 2 中:

$ g++ --version
g++ (Ubuntu 5.5.0-12ubuntu1~16.04) 5.5.0 20171010
...
$ make
g++ -MMD -g -g3 -Wall -Wunused -Wuninitialized -Wextra -fmessage-length=0 -std=gnu++11 -c -o obj/arrays_test.o src/arrays_test.cc
...

这里的问题是您使用的不是一个而是两个扩展程序。

如前所述,第一个扩展是您在 C++ 中使用 C99 VLA。那是 documented GCC extension.

第二个扩展是即使 C99 也不允许 VLA 的初始值设定项:

C99 §6.7.8 [Initialization]

The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.

(在 C11 中,您会在 §6.7.9 中找到此限制)。但正如链接的 GCC 页面所示,这不是官方的 Gnu 扩展。 C99 限制仍然有效。您需要使用赋值而不是初始化。