C ++数组大小声明和const
我只是跳进C ++,来自C
在C(89/90)中, const
实际上不是常量(与# #define
, enum
或literal相反),而是一旦设置为只读。 即,我可以:
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 d{}; const int x{d(e)}; int arr[x]; // compiles
我不知道这是否是有效的C ++。 显然,直到运行时才知道x
的值。 我想我可能不明白C和C ++ const
之间的区别?
您是正确的VLA是C99function ( 在C11中 是 可选的 ),并且C ++标准不包括此function,尽管gcc
和clang
允许它们在C ++中作为扩展。 我们可以看到他们不被允许进入C ++ 11标准草案 8.3.4
arrays说:
D1 [ constant-expressionopt] attribute-specifier-seqopt ^^^^^^^^^^^^^^^^^^^^^^
对于使用-pedantic
标志的gcc
和clang
,当您使用扩展时会发出警告。 如果您的目标是C ++ 11,那么您还应该使用-std=c++11
指定。 您可以使用-pedantic-errors
将警告转换为错误。 如果使用-pedantic
编译代码, -pedantic
应该看到以下警告:
warning: ISO C++ forbids variable length array 'arr' [-Wvla] int arr[x]; // compiles ^
gcc
记录了他们对各种标准,默认值和标志的支持,以强制执行GCC页面支持的语言标准标准,并说:
要获得标准所需的所有诊断,您还应指定-pedantic(或-pedantic-errors,如果您希望它们是错误而不是警告)。
一般来说, clang
支持gcc
function,但您可以在语言兼容性页面上找到更多详细信息。
请注意,如GingerPlusPlus std所述:vector被认为是C ++中VLA的替代品。