当前位置:  开发笔记 > 编程语言 > 正文

依赖于函数参数的C++数组大小会导致编译错误

如何解决《依赖于函数参数的C++数组大小会导致编译错误》经验,为你挑选了3个好方法。

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



1> 小智..:

您发现它是Gnu编译器对C++语言的扩展之一.在这种情况下,Visual C++是完全正确的.必须使用大小为编译时常量表达式来定义C++中的数组.

在1999年对该语言的更新中添加了一个称为可变长度数组的C,这是合法的.如果你能找到一个支持C99的C编译器,这并不容易.但是这个功能不是标准C++的一部分,不会在下一次更新C++标准时添加.

C++中有两种解决方案.第一个是使用std :: vector,第二个是使用运算符new []:

char *a = new char [n];

在我写答案时,另一个人发布了使用_alloca的建议.我强烈建议不要这样做.您只需将一个非标准的非可移植方法替换为另一个方法,就像编译器特定的那样.


"第二个就是使用"这里使用"just"这个词意味着手动管理动态数组生命周期比使用`std :: vector`对象更简单.这远非如此.

2> Jim Buck..:

从堆栈分配的方法是g ++扩展.要在MSVC下执行等效操作,您需要使用_alloca:

char *a = (char *)_alloca(n);



3> David Reis..:

您使用的不是标准的东西.实际上它是标准C而不是C++.这有多奇怪啊!

解释一下,运行时大小的堆栈数组不是C++的一部分,但它是C99的一部分,这是C的最新标准.这就是为什么有些编译器会得到它,而有些则不会.我建议不要使用它,以避免编译器兼容性问题.

该函数的替代实现将使用new和delete,由strager发布.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有