我刚刚进入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
?
答案 0 :(得分:9)
你是正确的VLAs are a C99 feature( C11中的可选)并且C ++标准不包括此功能,尽管gcc
和clang
允许它们在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的替代方案。