C ++数组大小声明和const

时间:2014-09-19 17:21:46

标签: c++ c arrays c++11 const

我刚刚进入C ++,来自C

在C(89/90)中,const实际上不是常数(与#define'd,enum或文字相对),而是只读一旦设定。即,我可以:

const int x = rand();

并且没关系 - 直到运行时才知道x这个点。因此,我不能

int arr[x]; // error - x is not a compile-time constant

然后,其中一个C标准(99?)继续进行,并允许使用可变长度数组。虽然我通常使用C语言中的ANSI标准编码,但实际上这已经产生了影响,因为我正在尝试拾取C ++ 11。

据我所知,C ++不允许使用可变长度数组。但是,许多编译器允许它作为扩展(GCC?)。问题是,现在我正在尝试学习C ++ 11,我无法判断我编写的是有效的C ++,还是C ++扩展的C99兼容性。例如:

std::default_random_engine e{};
std::uniform_int_distribution<int> d{};
const int x{d(e)};
int arr[x]; // compiles

我无法判断这是否是有效的C ++。显然,x的值直到运行时才知道。我想我可能不理解C和C ++之间的区别const

1 个答案:

答案 0 :(得分:9)

你是正确的VLAs are a C99 feature C11中的可选)并且C ++标准不包括此功能,尽管gccclang允许它们在C ++中延期。我们可以看到他们不允许转到draft C++11 standard部分8.3.4 数组,其中说:

D1 [ constant-expressionopt] attribute-specifier-seqopt
     ^^^^^^^^^^^^^^^^^^^^^^

使用gcc标志的clang-pedantic都会在您使用扩展程序时发出警告。如果您的目标是C ++ 11,那么您还应该使用-std=c++11指定。您可以使用-pedantic-errors将警告变为错误。如果使用-pedantic编译代码,您应该看到以下警告:

warning: ISO C++ forbids variable length array 'arr' [-Wvla]
int arr[x]; // compiles
         ^

gcc记录了他们对各种标准,默认值和标志的支持,以便在Language Standards Supported by GCC页面上执行标准,并说:

  

要获得标准所需的所有诊断,您应该   如果你想要它们,也可以指定-pedantic(或-pedantic-errors)   错误而非警告)。

一般情况clang支持gcc所做的事情,但您可以在Language Compatibility页面上找到更多详细信息。

GingerPlusPlus std:vector提到的注意事项被认为是C ++中VLA的替代方案。