在MS Visual C++中启用VLA(可变长度数组)?

Shi*_*nok 22 c c99 c89 visual-c++ variable-length-array

如何在MS Visual C++中启用使用C99中定义的VLA或可变长度数组,或者根本不可能使用?

是的我知道C++标准是基于C89的,并且VGA在C89标准中不可用,因此在C++中不可用,但MSVC++也应该是C编译器,可以使用/ TC编译器参数(Compile as C Code (/TC)).但这样做似乎并没有启用VLA,并且在构建为C++(Compile as C++ Code (/TP))时编译过程失败并出现相同的错误.也许MSVC++ C编译器只符合C89或者我缺少一些东西(一些特殊的构造或pragma/define)?

代码示例:

#include <stdlib.h>

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

  /* do something useful with pc */

  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

错误C2057:预期的常量表达式

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

错误C2133:'pc':未知大小

Ant*_*ams 24

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

https://docs.microsoft.com/en-us/cpp/c-language/ansi-conformance中, MSVC被记录为符合C90.

  • 不仅如此,它可能永远不会:http://connect.microsoft.com/VisualStudio/feedback/details/333273/request-for-c99-vla-in-visual-studio太糟糕了. (4认同)

Tin*_* LI 6

我遇到了同样的问题,这在MS Visual C++ 2015中是不可能的,相反你可以使用vector做几乎相同的,唯一的区别是堆资源管理例程(new/delete)的可忽略的开销.

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


Bow*_*ens 5

VLA更易于编写,但是alloca()当动态内存分配std::vector过高时,您可以获得类似的行为.

http://msdn.microsoft.com/en-us/library/x9sx5da1.aspx

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;
}
Run Code Online (Sandbox Code Playgroud)

  • `alloca`和它的朋友`_alloca`都被弃用,在新版本的msvc中支持`_malloca`.并且该函数使用起来非常烦人,最好只声明一个恒定长度的数组并使用它. (4认同)
  • 使用`alloca`的主要原因是因为堆栈内存比堆内存快。但是不能保证_malloca返回堆栈内存,这意味着当堆栈几乎已满时,在难以调试的边缘情况下,性能是无法预测的。在这些情况下,您将无法调试内存泄漏,而当您忘记释放分配的内存时,这种泄漏是不会发生的。诸如valgrind之类的工具无法提供帮助,因为99%的时间是从堆栈中获取内存,因此不存在泄漏!想象一下调试仅在某些计算机上发生的内存泄漏,因为它们的堆栈大小较小... (2认同)