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

Бор*_*нов 1 c gcc clang

最小代码示例:

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

看起来很好,是吗?变量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];
Run Code Online (Sandbox Code Playgroud)

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

dbu*_*ush 5

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

C标准的第6.7.6.2节开始:

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

尽管长度由a指定const int,但它不被视为常量表达式.即使使用尺寸类型static const int也不满足此要求.

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