【问题标题】:C++ array size declaration and constC++ 数组大小声明和 const
【发布时间】:2014-09-19 17:21:46
【问题描述】:

我只是跳入 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++,还是扩展了 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

【问题讨论】:

  • 无效。使用标志-std=... 其中... 是一个标准,例如c++11c++98.
  • 你也可以使用-pedantic
  • @juanchopanza 我实际上确实使用-std=c++11 进行了编译,并且clang 没有产生任何警告。按照 Shafik 的建议使用 -pedantic 标志会弹出警告!
  • 在 C++11 中无效,但 C++14 允许具有运行时大小的堆栈数组
  • @JohannesSchaub-litb,数组扩展 TS 没有进入 C++14。

标签: c++ c arrays c++11 constants


【解决方案1】:

您是正确的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 页面上强制执行标准,上面写着:

要获得标准要求的所有诊断,您应该 还指定 -pedantic (或 -pedantic-errors 如果您希望它们是 错误而不是警告)。

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

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

【讨论】:

  • 太棒了!!所以看来这个使用了C99扩展
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2012-07-14
  • 1970-01-01
  • 2013-10-26
  • 2020-03-06
  • 2010-10-30
相关资源
最近更新 更多