gpt4 book ai didi

c++ - gcc 4.8.2 和 gcc 4.9.0 在数组大小时的行为差异

转载 作者:太空宇宙 更新时间:2023-11-04 16:06:09 27 4
gpt4 key购买 nike

在 Gcc 4.8.2 及之前的版本中,以下代码无法编译,因为数组大小不是编译时常量。

#include<iostream>
using namespace std;

int f(){return 10;}
int main()
{
int i=10;
int arr[f()]={}; //error
}

当我尝试在 4.9 及更高版本上运行类似的代码时,相同的代码已成功编译。

是编译器允许这样的代码还是现在是标准的一部分?

注意:以上代码无法编译到 clang 3.7.1

最佳答案

可变长度数组是 C99 的一项功能,但允许在 GCC 中作为 C++ 的扩展。在 C99 中,初始化可变长度数组是非法的:

6.7.8/3 The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.

manual 中没有说明在 GCC 中初始化 VLA 是否非法。 ,因此您可以假设它是未定义的行为。但是,您还有另一个未定义行为的来源:f() 没有返回语句,因此程序中的任何事情都可能发生(段错误和异常是我在 GCC 4.9.0 中得到的两个不同结果)

它在 GCC 4.9.0 中编译成功的原因只有开发人员可以回答。提交错误报告。

推测:“运行时大小的数组”是 proposed将被添加到 C++14 但没有成功。 GCC 在 4.9 中实现了最初的提议。我之前提到的异常(exception)是提案中的一个特性:

Add a new section just before 18.6.2.2 new.badlength:

Class bad_array_length

  namespace std {
class bad_array_length : public bad_alloc {
public:
bad_array_length() noexcept;
};
}

The class bad_array_length defines the type of objects thrown as exceptions by the implementation to report an attempt to allocate an array of runtime bound with a size less than or equal to zero or greater than an implementation-defined limit (8.3.4 dcl.array).

bad_array_length() noexcept;

Effects: constructs an object of class bad_array_length. Remarks: the result of calling what() on the newly constructed object is implementation-defined.

文档指出在 GCC 5 及更高版本中,just regular VLAs现在支持。如果是这种情况,则应拒绝该代码。

关于c++ - gcc 4.8.2 和 gcc 4.9.0 在数组大小时的行为差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34939724/

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