我有一个简单的函数,其中声明一个数组的大小 取决于 int 的参数。
void f(int n){
char a[n];
};
int main() {
return 0;
}
这段代码在 GNU C++ 上编译得很好,但不在 MSVC 2005 上。
我收到以下编译错误:
.\main.cpp(4) : error C2057: expected constant expression
.\main.cpp(4) : error C2466: cannot allocate an array of constant size 0
.\main.cpp(4) : error C2133: 'a' : unknown size
我能做些什么来纠正这个问题?
(我有兴趣使用 MSVC 进行这项工作,而不使用 new/delete)
最佳答案
您发现它是 Gnu 编译器对 C++ 语言的扩展之一。在这种情况下,Visual C++ 是完全正确的。 C++ 中的数组必须使用编译时常量表达式的大小来定义。
在 1999 年对 C 语言的更新中添加了一项功能,称为可变长度数组,这是合法的。如果你能找到一个支持C99的C编译器,这并不容易。但是这个特性不是标准 C++ 的一部分,也不会在 C++ 标准的下一次更新中添加。
C++ 中有两种解决方案。第一个是使用std::vector,第二个只是使用运算符new []
:
char *a = new char [n];
在我写答案时,另一个人发布了使用 _alloca 的建议。我强烈建议不要这样做。您只需将一种非标准、不可移植的方法换成另一种编译器特定的方法。
关于C++ 数组大小取决于函数参数会导致编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/312116/