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

时间:2011-03-09 14:05:20

标签: c visual-c++ c99 c89 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或者我缺少一些东西(一些特殊的构造或编译指/定义)?

代码示例:

#include <stdlib.h>

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

  /* do something useful with pc */

  return EXIT_SUCCESS;
}

编译错误:

  

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

     

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

     

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

5 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分: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;
}

答案 2 :(得分:5)

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

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

答案 3 :(得分:0)

MSVC 2015 不支持 C99。 使用此逻辑使用动态内存分配代替..

#include <stdlib.h>

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

    /* do something useful with pc */
    
    free(pc);
    return EXIT_SUCCESS;
}

答案 4 :(得分:-1)

要使用c ++创建可变长度数组,请使用您的示例,您将执行以下操作:

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

如果要将其转换为std:string:

string buffer(pc.begin(), pc.end());