【问题标题】:Cannot compile static array with fixed size [duplicate]无法编译具有固定大小的静态数组[重复]
【发布时间】:2016-10-27 13:39:49
【问题描述】:

最小代码示例:

#include <stdio.h>
int main()
{
    const int a = 5;
    static int b[a];
    return 0;
}

看起来不错,嗯?变量a 是常量。也适用于 4.4。

gcc -v
gcc version 6.2.1 20160830 (GCC)
gcc 1.c
1.c: In function ‘main’:
1.c:6:16: error: storage size of ‘b’ isn’t constant
     static int b[a];

顺便说一句,clang 很好地编译了这段代码。

【问题讨论】:

  • 只是想知道为什么这不被视为 VLA...
  • @SouravGhosh 因为static
  • 它在https://gcc.godbolt.org/ 上使用 gcc 和 clang 编译得很好。
  • @MichaelWalz:试试-Werror=pedantic,编译会失败。这不是一个符合标准的 C 程序。
  • @MichaelWalz:现在这是一个 GCC 错误。

标签: c gcc clang


【解决方案1】:

声明为static 或在文件范围内(即具有静态存储持续时间)的数组不能是可变长度数组:

来自C standard 的第 6.7.6.2 节:

如果一个标识符被声明为具有可变修改 类型,它应该是一个普通的标识符(定义在 6.2.3),没有链接,并且具有块范围或函数原型范围。 如果一个标识符被声明为 具有静态或线程存储持续时间的对象,它不应 具有可变长度数组类型。

即使长度由const int 指定,它也不被视为常量表达式。即使使用static const int 类型的大小也不能满足这个要求。

请注意,这在 C++ 中有所不同,其中 static const int 被视为常量表达式。 C++11 也为此定义了constexpr 关键字。

【讨论】:

  • 当然我还要说,在 C++ 中,const int 只有在具有 constexpr 初始化程序时才被视为 constexpr。此外,您似乎甚至不需要 static (至少它在没有 gcc on godbolt 的情况下也可以工作)。
  • 嗯,其实是clang的问题,不符合标准。
  • @БорисСтепанов 这在clang中不是问题。从 C11(和 C99)标准来看,这两种行为都是合法的。如果编译器可以证明它是合理的,则允许编译器将任何内容视为常量表达式。标准只说明什么必须是常量,但允许任何东西都是常量表达式。
  • @HolyBlackCat:对不起,我看错了你的评论。
猜你喜欢
  • 2014-10-06
  • 2020-12-23
  • 2013-08-24
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 2016-09-08
  • 1970-01-01
相关资源
最近更新 更多