C++ 数组大小取决于函数参数会导致编译错误

标签 c++ arrays parameters declaration

我有一个简单的函数,其中声明一个数组的大小 取决于 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/

相关文章:

c++ - 在函数内部声明全局对象 (C++)

c++ - 不太了解 & 运算符的地址在此结构中的作用以及它如何能够访问其他成员变量

python - 如何获得形状为 (32,224,224) 的 np 数组,其中 [0] 包含 (244,224) 1's and [1] only 2' s?

c - 遍历c中的字符串数组

C++:如何通过其构造函数的参数初始化类内矩阵的维度?

javascript - 动态函数和动态参数/自变量

c++ - 寻找具有非唯一键或值的双向映射

c++ - 附加到数组的开头

c++ - 特定地址的字节数组c++

javascript - 如何将两个选定的哈希值传递到新 URL,同时保持下拉框中的两个项目处于选中状态