数组维度中的const值

时间:2017-03-20 07:35:22

标签: c const

以下代码段在C

中工作和编译
const int n=10;
int main(void)
{
    int a[n];
    return 0;
}

但是,当在全局范围内声明数组时,它会抛出编译错误。

const int n=10;
int a[n];
int main(void)
{
    return 0;
}

有人可以解释为什么它不会在主内部抛出错误。

1 个答案:

答案 0 :(得分:5)

尽管n被标记为const,但它不是编译时常量 1 。因此,数组a是可变长度数组 2

VLA不能有静态存储时间。将它放在文件范围使它成为一个静态变量,并且你的程序因为它 3 而格式不正确。

  1. C11 N1570/6.6p6

      

    整数常量表达式117)应具有整数类型,只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,_Alignof表达式和作为直接操作数的浮点常量转换。整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为sizeof或_Alignof运算符的操作数的一部分。

  2. C11 N1570/6.7.6.2p4

      

    如果大小不存在,则数组类型为不完整类型。如果大小是*而不是表达式,则数组类型是未指定大小的可变长度数组类型,它只能用于具有函数原型范围的声明或类型名称; 143)此类数组仍然是完整类型。 如果size是一个整型常量表达式,并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型;否则,数组类型是可变长度数组类型

  3. C11 N1570/6.7.6.2p2

      

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