数组声明中的常量表达式

时间:2012-08-23 22:55:32

标签: c++ arrays constexpr

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标记编译的程序

为什么?

3 个答案:

答案 0 :(得分:8)

您的代码实际上是合法的C ++。有些编译器允许使用可变长度数组作为扩展,但它不是标准的C ++。要让GCC抱怨这一点,请通过-pedantic。一般来说,你应该总是至少传递这些警告标志去GCC:

-W -Wall -Wextra -pedantic

答案 1 :(得分:3)

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

答案 2 :(得分:1)

其他答案已经提供了解决方案,g ++允许变量长度数组(VLA)作为C ++中的扩展(技术上,VLA是来自C90的C特征)。为了确保您使用的是符合标准的C ++,请通过-pedantic发出警告并-pedantic -Werror将警告设置为硬错误。

在调试模式下编译时,我建议如下:

  

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

O0optimization flag-g3用于debugging。当您想要使用优化而不需要调试时,需要更改这些。 但是,有时可能需要删除-Werror -Wconversion,因为您可能由于某些原因(例如使用第三方库时)无法更改代码。有关每个人的作用的说明,请参阅to here