数组声明中的常量表达式

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;也没有任何问题。

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

为什么会这样呢?


1
你是否开启了所有警告?-W -Wall -Wextra -pedantic - Kerrek SB
1
https://dev59.com/fHE85IYBdhLWcg3wQxPG - P.P
确实会出现 ISO C++禁止可变长度数组 的警告。虽然不是错误。请回答,以便我可以接受。 - James Raitsev
1
这是另一个:https://dev59.com/0nRB5IYBdhLWcg3wCjnO - P.P
@Jam,这是-Werror的错误。 - chris
3个回答

8

你的代码实际上并不是合法的C++。一些编译器允许变长数组作为扩展,但这不是标准的C++。如果要让GCC抱怨这个问题,可以传递-pedantic。通常来说,你应该至少传递以下警告标志给GCC:

-W -Wall -Wextra -pedantic

“-W”和“-Wextra”不是一样的吗? - Jesse Good
@JesseGood:嗯,也许我不是最新的。随意发表更适合的内容。 - Kerrek SB

3

你知道哪个gcc 4.x支持可变长度数组吗?i686-apple-darwin11-llvm-g++-4.2(GCC)4.2.1似乎不支持。 - denis
我不太确定这个功能是什么时候添加的。 - bstamour

1
其他答案已经提供了解决方案,g++允许变量长度数组(VLAs)作为C++的扩展(从技术上讲,VLAs是C90的一个特性)。为确保您使用符合标准的C ++,请传递 -pedantic 以获得警告和 -pedantic -Werror 将警告转换为硬错误。

我建议在调试模式下进行编译时使用以下命令:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接