计划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编译成功?
答案 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都会对此代码发出警告。