Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数组声明中的常量表达式_C++_Arrays_Constexpr - Fatal编程技术网

C++ 数组声明中的常量表达式

C++ 数组声明中的常量表达式,c++,arrays,constexpr,C++,Arrays,Constexpr,说 数组维度必须在编译时已知,这意味着 维度必须是常量表达式 另一个观点是: unsigned count = 42; // not a constant expression constexpr unsigned size = 42; // a constant expression 那么,我希望下面的声明会失败 a[count]; // Is an error according to Primer 但事实并非如此。编译并运

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

另一个观点是:

unsigned count = 42;           // not a constant expression
constexpr unsigned size = 42;  // a constant expression
那么,我希望下面的声明会失败

a[count];                      // Is an error according to Primer
但事实并非如此。编译并运行良好

还有一点奇怪的是,
++计数也不会导致任何问题

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

<>为什么?

< P>根据这个链接:GCC支持C90模式和C++中的可变长度C数组。因为它不是标准C++,所以应该把它当作编译器扩展,因此假定它不是可移植的。

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

-W-Wall-Wextra-pedantic

< /代码> < P>其他答案已经提供了解决方案,G++允许变量长度数组(VLAS)作为C++的扩展(技术上VLAs是C90的C特征)。为了确保你使用的是标准符合C++,通过<代码> -PoaTiTIC< <代码>以获得警告和<代码> -Poangnistic - Werror < /C> >使警告成为硬错误。< /P> 在调试模式下编译时,我建议执行以下操作:

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

O0
是一个,而
-g3
用于。当您想要使用优化而不需要调试时,需要更改这些参数。
但是,有时可能需要删除
-Werror-Wconversion
,因为某些原因,例如在使用第三方库时,您可能无法更改代码。有关每一项功能的说明,请参阅。

编译时是否包含所有警告<代码> -W-WOR-WE-WORD - PEDANDICT/<代码>确实>代码> ISO C++禁止可变长度数组< /代码>警告。但这不是一个错误。请回答以便我能接受另一个问题:@Jam,这是
-Werror
的一个错误。
-W
-Wextra
不是一样吗?@JesseGood:Hm,也许,我可能不是最新的。请随意发布更合适的内容。您知道哪种GCC4.x支持VLA吗?i686-apple-darwin11-llvm-g++-4.2(GCC)4.2.1似乎不太清楚我真的不确定这项功能是什么时候添加的。