【问题标题】:Why is int a[0] allowed in c++? [duplicate]为什么 c++ 中允许使用 int a[0]? [复制]
【发布时间】:2016-09-13 06:33:17
【问题描述】:

我发现在数组的声明中,我们不能像这样指定它的大小

int a[0];

我知道,空大小的数组在 C++ 中是非法的,但是在我的代码中,空大小的数组编译器允许并给出输出。

我的代码在这里:

#include <iostream>
using namespace std;

int main()
{
        int a[0];

        a[0] = 10;
        a[1] = 20;

        cout<<a[0]<<endl;
        cout<<a[1]<<endl;

        return 0;
}

输出:

10
20

在线编译链接:http://code.geeksforgeeks.org/TteOmO

所以,我的问题是,为什么 int a[0] 允许 GCC 编译器?

【问题讨论】:

  • 执行int a[0]; a[0] = 10; a[1] = 20; 将导致FireWorks(UB)。
  • OP 知道这是错误的,问题是为什么编译器不会引发错误。我想,答案是它不能为你做所有事情;)
  • error: ISO C++ forbids zero-size array 'a' [-Wpedantic]int a[0];
  • 很可能是因为添加了一个禁止它的特殊规则会增加太多的解析器复杂性而收效甚微。
  • 允许,因为它是gcc extension

标签: c++ arrays


【解决方案1】:

它发出警告,例如 clang 输出:

warning: zero size arrays are an extension [-Wzero-length-array]

这是未定义的行为:

    a[0] = 10;
    a[1] = 20;

零长度数组是 gcc 的扩展,为什么 - 你可以在这里阅读:

https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

它们作为结构的最后一个元素非常有用,它实际上是可变长度对象的标头:

这实际上是 C 扩展,但它看起来也用于 C++,可能是为了更容易使用 C 中使用此扩展的现有结构。

【讨论】:

【解决方案2】:

请调查一下

What happens if I define a 0-size array in C/C++? 如果它是一个好的编译器,它会捕捉到它并发出警告。 但是用迂腐的选项编译器可以抓住它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多