28

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

是的,我知道 C++ 标准基于 C89,并且 VLA 在 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”:未知大小

4

5 回答 5

29

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

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

于 2011-03-09T14:10:19.513 回答
8

alloca()VLA 编写起来要简洁得多,但是当动态内存分配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;
}
于 2013-08-13T00:30:55.053 回答
6

我遇到了同样的问题,这在 MS Visual C++ 2015 中是不可能的,相反你可以使用向量来做几乎相同的事情,唯一的区别是堆资源管理例程(新建/删除)的可忽略的开销。

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

于 2018-03-01T01:21:11.583 回答
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;
}
于 2021-07-03T18:15:07.927 回答
-1

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

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

如果您想将其转换为 std:string:

string buffer(pc.begin(), pc.end());
于 2020-05-14T06:19:19.150 回答