以下代码段在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;
}
有人可以解释为什么它不会在主内部抛出错误。
答案 0 :(得分:5)
尽管n
被标记为const,但它不是编译时常量 1 。因此,数组a
是可变长度数组 2 。
VLA不能有静态存储时间。将它放在文件范围使它成为一个静态变量,并且你的程序因为它 3 而格式不正确。
整数常量表达式117)应具有整数类型,只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,_Alignof表达式和作为直接操作数的浮点常量转换。整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为sizeof或_Alignof运算符的操作数的一部分。
如果大小不存在,则数组类型为不完整类型。如果大小是*而不是表达式,则数组类型是未指定大小的可变长度数组类型,它只能用于具有函数原型范围的声明或类型名称; 143)此类数组仍然是完整类型。 如果size是一个整型常量表达式,并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型;否则,数组类型是可变长度数组类型。
如果标识符被声明为具有可变修改类型,则它应该是普通标识符(如6.2.3中所定义),没有链接,并且具有块范围或函数原型范围。 如果标识符被声明为具有静态或线程存储持续时间的对象,则它不应具有可变长度数组类型。