数组维度必须在编译时知道,这意味着 维度必须是常量表达式
另外一点是
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
标记编译的程序
为什么?
答案 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
O0
是optimization flag,-g3
用于debugging。当您想要使用优化而不需要调试时,需要更改这些。
但是,有时可能需要删除-Werror -Wconversion
,因为您可能由于某些原因(例如使用第三方库时)无法更改代码。有关每个人的作用的说明,请参阅to here。