无法编译固定大小的静态数组

时间:2016-10-27 13:39:50

标签: c gcc clang

最小代码示例:

#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很好地编译了这段代码。

1 个答案:

答案 0 :(得分:5)

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

来自C standard的第6.7.6.2节:

  

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

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

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