C++数组大小声明和常量

C++ array size declaration and const

本文关键字:常量 声明 数组 C++      更新时间:2023-10-16

我只是从C 跳到C++

在C(89/90)中,const实际上不是常数(与#define'd、enum或文字相反),而是设置后只读的。I.e,我可以:

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++,还是具有C99兼容性的C++扩展。例如:

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之间的区别?

您是正确的VLA是C99功能(在C11中是可选的),C++标准不包括此功能,尽管gccclang都允许它们在C++中作为扩展。我们可以从C++11标准草案8.3.4数组中看到它们是不允许的,其中写道:

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

对于gccclang,当您使用扩展时,使用-pedantic标志将发出警告。如果您的目标是C++11,那么您还应该使用-std=c++11指定它。您可以使用-pedantic-errors将警告转换为错误。如果您使用-pedantic编译代码,您应该看到以下警告:

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

gcc记录了他们对各种标准、默认值和标志的支持,以在GCC支持的语言标准页面上执行标准,并显示:

要获得标准所需的所有诊断,您应该还要指定-pedantic(如果希望的话,也可以指定-pedntic错误错误而不是警告)。

一般来说,clang支持gcc的功能,但您可以在其"语言兼容性"页面上找到更多详细信息。

GingerPlusPlus std:vector被认为是C++中VLA的替代方案。