4

C++ Primer

数组维度必须在编译时已知,这意味着维度必须是常量表达式

一个单独的观点是

unsigned count = 42;           // not a constant expression
constexpr unsigned size = 42;  // a constant expression

我会,然后期望以下声明失败

a[count];                      // Is an error according to Primer

然而,事实并非如此。编译并运行良好。

同样奇怪的是,++count;数组声明之后也没有引起任何问题。

-std=c++11使用标志编译的程序g++4.71

这是为什么?

4

3 回答 3

8

您的代码实际上不是合法的 C++。一些编译器允许可变长度数组作为扩展,但它不是标准的 C++。要让 GCC 抱怨这一点,请通过-pedantic. 通常,您应该始终将至少这些警告标志传递给 GCC:

-W -Wall -Wextra -pedantic
于 2012-08-23T23:11:12.660 回答
3

根据此链接:http : //gcc.gnu.org/onlinedocs/gcc/Variable-Length.html,GCC 在 C90 模式和 C++ 中支持可变长度 C 数组。由于它不是标准的 C++,因此您应该将其视为编译器扩展,因此假定它不可移植。

于 2012-08-23T22:58:57.927 回答
1

其他答案已经提供了解决方案,g++ 允许可变长度数组 (VLA) 作为 C++ 中的扩展(从技术上讲,VLA 是 C90 的 C 功能)。为确保您使用的是符合标准的 C++,请传递-pedantic以获取警告并将-pedantic -Werror警告变为硬错误。

在调试模式下编译时,我推荐以下内容:

g++ -std=c++11 -O0 -g3 -pedantic -pedantic-errors -Wall -Wextra -Werror -Wconversion

O0是一个优化标志-g3用于调试。当您想要使用优化并且不需要调试时,需要更改这些。但是,-Werror -Wconversion有时可能需要删除,因为您可能由于某些原因(例如使用第三方库时)无法更改代码。有关每个功能的描述,请参阅此处

于 2012-08-23T23:47:48.263 回答