可变工作的初始化可变长度数组(计算机之间)
Initialized Variable Length Array Working Variably (Between Computers)
我有一些代码使用变量来初始化数组,特别是 C 字符串。例如...
int len = getLength();
char cstr[len+1] = {'[=10=]'};
这在我的代码中编译和运行完美。但是,当我的一位同事运行相同的代码时,他得到了编译器错误...
Variable-sized object may not be initialized
我们都在使用 Ubuntu 和 GCC/G++。我们比较了编译器标志,我们都使用 --std=c++11
。其余所有标志也相同(-Wall
、-Wextra
和 -g
)。
为什么这段代码只能在我的电脑上运行,而他的却不行?我怎样才能让它工作?
这是不同编译器版本的情况。当我们都运行g++ --version
在我们的终端时,我们发现他是运行4.8
,而我是运行4.9
.
GCC 长期以来一直支持 C99
可变长度数组 (VLA),其中声明了变量,但未给出初始化列表。因此,我的同事可以通过从每次初始化中删除 {'[=14=]');
来解决错误(在这种情况下也破坏了代码。)
然而,在过去的日子里,GCC 不 支持 C++1y
VLA,这就是我在问题示例中所拥有的。他们刚刚添加了对 GCC 4.9 中的支持(参见 Changelog)。
Ubuntu 14.04(我的同事拥有的)随 GCC 4.8 一起提供,而 Ubuntu 15.04(我拥有的)随 GCC 4.9 一起提供。因此,我们必须使用相同的编译器版本,即 GCC 4.9。 (有关操作的说明在 this question 上。)
如果您 运行 在 Windows 上遇到这个问题,也有一些选择。在撰写本文时,MSYS2 currently offers GCC 5.2 by default, and TDM-GCC 提供 GCC 5.1。
我有一些代码使用变量来初始化数组,特别是 C 字符串。例如...
int len = getLength();
char cstr[len+1] = {'[=10=]'};
这在我的代码中编译和运行完美。但是,当我的一位同事运行相同的代码时,他得到了编译器错误...
Variable-sized object may not be initialized
我们都在使用 Ubuntu 和 GCC/G++。我们比较了编译器标志,我们都使用 --std=c++11
。其余所有标志也相同(-Wall
、-Wextra
和 -g
)。
为什么这段代码只能在我的电脑上运行,而他的却不行?我怎样才能让它工作?
这是不同编译器版本的情况。当我们都运行g++ --version
在我们的终端时,我们发现他是运行4.8
,而我是运行4.9
.
GCC 长期以来一直支持 C99
可变长度数组 (VLA),其中声明了变量,但未给出初始化列表。因此,我的同事可以通过从每次初始化中删除 {'[=14=]');
来解决错误(在这种情况下也破坏了代码。)
然而,在过去的日子里,GCC 不 支持 C++1y
VLA,这就是我在问题示例中所拥有的。他们刚刚添加了对 GCC 4.9 中的支持(参见 Changelog)。
Ubuntu 14.04(我的同事拥有的)随 GCC 4.8 一起提供,而 Ubuntu 15.04(我拥有的)随 GCC 4.9 一起提供。因此,我们必须使用相同的编译器版本,即 GCC 4.9。 (有关操作的说明在 this question 上。)
如果您 运行 在 Windows 上遇到这个问题,也有一些选择。在撰写本文时,MSYS2 currently offers GCC 5.2 by default, and TDM-GCC 提供 GCC 5.1。