gcc抱怨:可能无法初始化变量大小的对象

vio*_*313 7 c gcc gcc4

我看过这些并且他们没有回答我的问题:

可能无法初始化可变大小的对象

C编译错误:"可能无法初始化可变大小的对象"

错误:可能无法初始化可变大小的对象.但为什么?


我正在尝试编写一些相当可移植的c代码:

int main () 
{
    const int foo=13;
    int bar[foo]={0};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


使用以下任 一方法variable-sized object may not be initialized编译c代码时出错:

  • gcc 4.3.4
  • arm-linux-gnueabi-gcc 4.4.5

如果我cVS2008中编译它,我得到一个略有不同error C2057: expected constant expression


我明白,在这里,c代码编译器并没有认识const int foo=13;到它是真正的常量; 例如我们可能有

void a(int fool) 
{    
    const int foo=fool;
    int bar[foo]={0};
}
Run Code Online (Sandbox Code Playgroud)


我也意识到,与gcc编译器不同,VS2008编译器没有C99可变长度数组的概念.那个MS显然没有提到任何未来的支持.


然而,cpp使用gccMS编译器编译代码完全不同/更聪明?


而且我不明白有关GCC c代码编译为:


(注意:在最后一种情况下,MS c代码编译失败;始终如一int bar[foo]={0};)

Mat*_*Mat 10

C99§6.7.8 初始化说明:

要初始化的实体的类型应该是未知大小的数组或不是可变长度数组类型的对象类型.

所以你的初始化是无效的C.

为唯一的方法type a[size],以成为VLA为size是一个整数常量表达式(§6.7.5.2).你有什么不是一个整数常量表达式,所以你有一个VLA:

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

Part§6.6/ 6 常量表达式将它们定义为:

整数常量表达式应具有整数类型,并且只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,以及作为强制转换的直接操作数的浮点常量.整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为sizeof运算符的操作数的一部分.