在通过在main中声明数组来解析之前,数组绑定不是整数常量

时间:2014-07-17 03:25:34

标签: c++

计划1

#include <iostream>

std::size_t three() {
    return 3;
}

int i[three()];

int main() 
{
    return 0;
}

计划2

std::size_t three() {
    return 3;
}

int main() 
{
    int i[three()];
    return 0;
}

这里的问题是程序1按预期给出了编译错误

  

“错误:数组绑定不是']'标记'之前的整数常量

但我不知道为什么程序2编译成功?

1 个答案:

答案 0 :(得分:4)

C99允许int i[three()];声明一个可变长度数组,但只能if it is not of static or thread storage duration。在文件范围内声明它意味着它具有静态存储持续时间,因此即使在C99中它也是非法的。以main()方式声明它意味着它具有自动存储持续时间,这在C99中是允许的。

GCC和Clang等一些编译器也支持C89和C ++模式,作为扩展。但就标准而言,这不是合法的C ++。如果使用-pedantic编译,GCC和Clang都会对此代码发出警告。