在MS Visual C+中启用可变长度数组+;? 如何在VC+C++中使用VCL定义的可变长度数组,或者完全不可能?< /P> 是的,我知道C++标准是基于C89的,VLAs在C89标准中是不可用的,因此在C++中是不可用的,但是MSVC++也应该是一个C编译器,它是一个使用T/TC编译器参数(代码>编译为C代码(/TC)< /代码>)的行为。但是这样做似乎不能使VLAs和编译过程在构建为C++时(代码 >时出现同样的错误。也许MSVC++C编译器只兼容C89,或者我缺少了一些东西(一些特殊的构造或pragma/define)

在MS Visual C+中启用可变长度数组+;? 如何在VC+C++中使用VCL定义的可变长度数组,或者完全不可能?< /P> 是的,我知道C++标准是基于C89的,VLAs在C89标准中是不可用的,因此在C++中是不可用的,但是MSVC++也应该是一个C编译器,它是一个使用T/TC编译器参数(代码>编译为C代码(/TC)< /代码>)的行为。但是这样做似乎不能使VLAs和编译过程在构建为C++时(代码 >时出现同样的错误。也许MSVC++C编译器只兼容C89,或者我缺少了一些东西(一些特殊的构造或pragma/define),c,visual-c++,c99,c89,variable-length-array,C,Visual C++,C99,C89,Variable Length Array,代码示例: #include <stdlib.h> int main(int argc, char **argv) { char pc[argc+5]; /* do something useful with pc */ return EXIT_SUCCESS; } #包括 int main(int argc,字符**argv) { char-pc[argc+5]; /*用pc做一些有用的事情*/ 返回退出成功; } 编译错误: 错误C2057:应为常量表达式

代码示例:

#include <stdlib.h>

int main(int argc, char **argv)
{
  char pc[argc+5];

  /* do something useful with pc */

  return EXIT_SUCCESS;
}
#包括
int main(int argc,字符**argv)
{
char-pc[argc+5];
/*用pc做一些有用的事情*/
返回退出成功;
}
编译错误:

错误C2057:应为常量表达式

错误C2466:无法分配常量大小为0的数组

错误C2133:“pc”:未知大小


MSVC不是C99编译器,不支持可变长度数组


MSVC被证明符合C90。

VLA的编写更简洁,但当
std::vector
的动态内存分配被禁止时,使用
alloca()
可以获得类似的行为

在您的示例中使用
alloca()
,将给出:

#include <stdlib.h>
#include <alloca.h>

int main(int argc, char **argv)
{
  char* pc = (char*) alloca(sizeof(char) * (argc+5));

  /* do something useful with pc */

  return EXIT_SUCCESS;
}
#包括
#包括
int main(int argc,字符**argv)
{
char*pc=(char*)alloca(sizeof(char)*(argc+5));
/*用pc做一些有用的事情*/
返回退出成功;
}

>P>我遇到了同样的问题,这在MS Visual C++ 2015中是不可能的,相反,你可以使用向量来做几乎相同的事情,只是差异是堆资源管理程序(NeX/DELL)的可忽略开销。

虽然VLAs很方便,但是从堆栈溢出的风险中分配不确定的内存量通常不是一个好主意。

< P>使用C++创建一个可变长度数组,使用你的例子,你会做如下的事情:

size_t size = argc + 5;
vector<char> pc(size);

不仅如此,它可能永远不会:太糟糕了。那就解决了争端。:-)该语言是否有Microsoft扩展来支持VLAs?GCC有一个,因此使他们能够C90和C++,除了C99符合。我认为John提供的链接表明没有,也不会很快。这些反馈来自2008年,但今天可能也是如此。谢谢你的回答。我们不支持VLAs。MS建议使用编译器的C++模式,以STD::vector替换VLAs,两个代码版本> AlLoAs<代码>及其朋友>代码>该函数使用起来非常烦人,因此最好只声明一个长度恒定的数组并使用它。您不需要释放alloca分配的内存吗?@HaSeeBMiR No。由于alloca()分配的内存位于堆栈上,因此当堆栈展开时,它会自动回收。有关详细信息,请参阅您版本的文档。@BjörnLindqvist:u malloca()
有什么让您恼火的地方?显式调用
\u freea()
将允许在需要时轻松替换其他分配方法,并且能够调用
\u freea()在函数的中间,似乎比在函数退出之前没有任何释放内存的方法更有用。使用<代码> AlLoga < /C>的主要原因是堆栈内存比堆内存快。但是
\u malloca
不能保证返回堆栈内存,这意味着当堆栈几乎满时,在难以调试的边缘情况下性能不可预测。在这些场景中,您将无法调试在忘记释放分配的内存时不会发生的内存泄漏。没有像valgrind这样的工具可以帮上忙,因为99%的时间内存都是从堆栈中取出的,所以泄漏就不存在了!想象一下调试一个只在一些机器上出现的内存泄漏,因为它们的堆栈大小较小。C++用户应该使用<代码> STD::向量< /代码>而不是VLA。但是,由于C语言的要求,这个建议对这个问题没有帮助。这个问题被标记为C。关于其他编程语言的答案是离题的,没有帮助。
string buffer(pc.begin(), pc.end());