我有一些代码使用变量初始化数组,特别是C字符串。例如......
int len = getLength();
char cstr[len+1] = {'\0'};
这在我的代码中编译并运行完美。但是,当我的一个同事运行相同的代码时,他会收到编译器错误...
可能无法初始化可变大小的对象
我们都使用Ubuntu和GCC / G ++。我们已经比较了编译器标志,我们都使用--std=c++11
。所有其他标志也是相同的(-Wall
,-Wextra
和-g
)。
为什么这段代码只能在我的电脑上运行,而不是他的?我怎样才能让它发挥作用?
答案 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。