gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:28:09 27 4
gpt4 key购买 nike

我刚跳入 C++,来自 C

在 C (89/90) 中,const 实际上不是常量(与 #define 相对,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++,还是扩展了 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 之间的区别?

最佳答案

你是对的VLAs are a C99 feature (在 C11 中可选)和 C++ 标准不包含此功能,尽管 gccclang 允许它们在 C++ 中作为扩展。我们可以通过转到 draft C++11 standard 看到它们是不允许的8.3.4 Arrays 部分说:

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 记录了他们对各种标准、默认值和标志的支持,以在其 Language Standards Supported by GCC 上执行标准页面上写着:

to obtain all the diagnostics required by the standard, you should also specify -pedantic (or -pedantic-errors if you want them to be errors rather than warnings).

一般来说,clang 支持 gcc 的功能,但您可以在其 Language Compatibility 上找到更多详细信息页面。

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

关于C++ 数组大小声明和常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25939260/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com