可变大小数组可变地工作(在计算机之间)

时间:2015-11-06 16:51:37

标签: c++ arrays c++11

我有一些代码使用变量初始化数组,特别是C字符串。例如......

int len = getLength();
char cstr[len+1] = {'\0'};

这在我的代码中编译并运行完美。但是,当我的一个同事运行相同的代码时,他会收到编译器错误...

  

可能无法初始化可变大小的对象

我们都使用Ubuntu和GCC / G ++。我们已经比较了编译器标志,我们都使用--std=c++11。所有其他标志也是相同的(-Wall-Wextra-g)。

为什么这段代码只能在我的电脑上运行,而不是他的?我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:-1)

这是不同编译器版本的情况。当我们在终端中运行g++ --version时,我们发现他正在运行4.8,而我正在运行4.9

GCC长期以来一直支持C99可变长度数组(VLA),其中声明了一个变量,但未给出初始化列表。因此,我的同事可以通过从每次初始化中删除{'\0');来解决错误(在这种情况下也破坏了代码。)

但是,在过去的日子里,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目前默认提供GCC 5.2,TDM-GCC提供GCC 5.1。