使用 Visual C++ 编译器 (Visual Studio 2010) 的可变数组大小出错。如何规避这个问题?

Posted

技术标签:

【中文标题】使用 Visual C++ 编译器 (Visual Studio 2010) 的可变数组大小出错。如何规避这个问题?【英文标题】:Error with variable array size using the visual C++ compiler (Visual Studio 2010). How to circumvent this issue? 【发布时间】:2011-04-04 08:53:59 【问题描述】:

我在编译一个在 GCC 下运行良好的 c++ 文件时遇到了一些麻烦。 问题是,我正在使用可变数组大小的向量:

unsigned int howmany;
std::vector<int>* array_adresses[howmany]; 

我目前正在使用 Visual-Studio 2010 C++ 编译器来构建 Matlab 64 位 Mex 文件。 由于 VC++ 不允许我使用在编译时大小未知的数组,我收到以下错误消息:

错误 2057:需要常量表达式 错误 2466: 错误 2133:未知大小

有没有办法使用 GCC 编译器选项构建 64 位 mex 文件,或者在 Matlab 下使用不同的 64 位编译器构建它?

提前致谢!!

【问题讨论】:

您正在声明一个指向vector&lt;int&gt; 的指针数组。这真的是你想要的吗? @Lord Flashback:对吗?也许。丑陋?绝对:) 为什么不使用指向向量的指针向量呢? 是的,这可能是避免可变数组大小问题的一种方法。仍然存在的问题是我是否可以成功编译当前程序而无需对代码进行重大更改。 那么就照常做吧。 std::vector&lt;int&gt;** array_adresses; 然后在你使用它之前的某个地方new 它。另一种理解方式是:如果编译器在编译时不知道数组的大小,它应该为你的数组分配多少空间? 如果编译器在编译时不知道数组的大小,它应该为你的数组分配多少空间?好吧,对 VC++ 的内部工作原理了解不多——编译器我可以确认 GCC 允许定义可变大小的一维数组。 Fortran 也是如此(甚至是多维的!)。当我使用new array[varsize]分配一个新数组时,如果在编译时不知道 varsize,VC++ 不会抛出错误,对吗? 【参考方案1】:

howmany 需要保持不变,并且需要是定义的数量,如下所示:

const unsigned int howmany = 5;
std::vector<int>* array_adresses[howmany];

或者你可以像这样动态定义它:

unsigned int howmany = 5;
std::vector<int>* array_adresses = new std::vector<int>[howmany];

【讨论】:

这就是它的全部内容,howmany 是一个未知参数。它作为输入参数传递到 Mex-Function Stack。 @Lord Flashback 只需将 howmany 设置为输入参数并动态创建 array_addresses。 正确地说:动态是指在堆上分配内存而不是在内存大小未知的堆栈上分配? @Lord Flashback 好吧,我不熟悉使用 Matlab,但是按照你的做法,这就是我所说的动态: unsigned int howmany; std::vector* array_adresses = new std::vector[howmany]; @leeetNightshade:是的,堆上的动态分配效果很好,我可以在不对代码进行重大更改的情况下实现它!【参考方案2】:

C++ 标准不允许变长数组。让我们来看看这段代码:

int main(int argc, char *argv[])

    int a[argc];
    return 0;

这与 g++ foo.cpp 编译得很好,但如果您需要严格的标准合规性,则会失败。

g++ foo.cpp -std=c++98 -pedantic:

foo.cpp: In function ‘int main(int, char**)’:
foo.cpp:8: warning: ISO C++ forbids variable length array ‘a’

您应该使用 vector&lt;vector&lt;int&gt; *&gt;vector&lt;int&gt; **,就像其他人已经建议的那样。

【讨论】:

【参考方案3】:

只需更换 int ptr[howmany];vector&lt;int&gt; ptr(howmany); 在范围结束时也获得自动释放。

【讨论】:

以上是关于使用 Visual C++ 编译器 (Visual Studio 2010) 的可变数组大小出错。如何规避这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Visual C++ 编译器 (Visual Studio 2010) 的可变数组大小出错。如何规避这个问题?

面向 XP 的 Visual Studio 2013 的 Visual C++ 编译器标志

我可以在没有 Visual Studio 的情况下使用 Visual C++ 编译器吗? [关闭]

我可以在 Visual Studio 2008 中使用 Visual Studio 6 编译的 C++ 静态库吗?

Visual Studio 2005 C++ 编译器比 Visual Studio 6 编译器慢?

使用纯 C++ 编译器与 Visual C++