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 限制仍然有效。您需要使用赋值而不是初始化。
我有以下简单的来源
#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 限制仍然有效。您需要使用赋值而不是初始化。