如何将VisualStudio用作可变长度数组(VLA)工作的IDE? 在任何C或C++的普通编译器中,可变长度数组都正常工作,但是在Visual Studio社区2019中,VLAS不工作。我如何以任何方式使用VisualStudio作为IDE(因为我喜欢它的特性),并且在C和C中仍然有VLA++

如何将VisualStudio用作可变长度数组(VLA)工作的IDE? 在任何C或C++的普通编译器中,可变长度数组都正常工作,但是在Visual Studio社区2019中,VLAS不工作。我如何以任何方式使用VisualStudio作为IDE(因为我喜欢它的特性),并且在C和C中仍然有VLA++,c++,c,visual-studio,variable-length-array,C++,C,Visual Studio,Variable Length Array,我试图更改它使用的编译器。我试图找到migwin编译器,但找不到。所有在线教程都与我在最新版本的Visual Studio 2019中看到的不同 int n; cin>>n; int arr[n]; // This line gives an error int-arr[n]//这一行应该在VisualStudio2019中工作。没关系 它使用什么编译器。只是我需要让这件事在VS社区2019中起作用 因为我想用它作为IDE。< /P> < P>这个答案是关于C++的。 可变长度数组

我试图更改它使用的编译器。我试图找到migwin编译器,但找不到。所有在线教程都与我在最新版本的Visual Studio 2019中看到的不同

int n;
cin>>n;
int arr[n]; // This line gives an error
int-arr[n]//这一行应该在VisualStudio2019中工作。没关系 它使用什么编译器。只是我需要让这件事在VS社区2019中起作用
因为我想用它作为IDE。< /P> < P>这个答案是关于C++的。

可变长度数组不是ISO C++标准,有些编译器将其作为扩展。 e、 g

ISO C99、中允许使用可变长度的自动数组,并且作为 扩展GCC接受C90模式和C++中的< <强> > /P>
编辑

这样的扩展仍然可以是一个实现,只要它不改变格式良好的程序的行为


但是,如果您使用VLA,那么您的代码是不可移植的,因为其他编译器可能有也可能没有这样的扩展,现在已经有扩展的编译器可以在供应商决定放弃支持时停止工作

如果你不知道编译时的大小,想用C++,那么就用。您只需将代码更改为:

int n;
cin>>n;
vector<int> arr(n);
intn;
cin>>n;
向量arr(n);

但是,如果您需要VLA,这里有一个支持它的编译器列表: 实时(支持带有绿色标记的编译器)

MSVC不在列表中。所以你可以在你的VS中使用叮当声。这里是一个例子。 甚至更简单,您可以在以下设备上使用开箱即用支持:

在Windows上,安装叮当工具很容易。抓住“叮当声” Windows编译器“桌面的可选组件” 用C++开发“工作负载”。这将安装您所需的一切 在Windows上使用叮当声进行开发

在任何普通的C或C++编译器中,可变长度数组都正常工作< 这取决于我怎么读这个句子,它要么是重复的,要么是荒谬的。是的,正常的事情正常工作,但是VLA在C++中“工作”只是在没有被语言定义的意义下。p> VLA由C定义,已经存在了20年。是的,很多C编译器——但不是C++编译器——支持它们。一个明显的例外是微软的编译器,它没有。它不符合C99标准(更不用说C11、C14或C17)。你可以说他们落后了一点。他们的立场似乎是,他们将实现C语言的大部分,因为他们发现在C++编译器的上下文中是方便的。不是C++部分的C部分不符合要求。p> 这一点很清楚:保持C编译器的最新版本并不是微软的首要任务

只是我需要让它在VSCommunity2019中工作,因为我想将它用作IDE

简单的事实是,如果你想在现代C语言中工作,就不能使用微软的编译器。您可能能够了解如何配置IDE以使用GNU编译器。然而,在某个时刻,你可能会开始问,是否值得花时间与一个对你的目标如此敌对的体系搏斗

> VLAS可用于C++应用的“CGED项目”。创建一个新的“CMake项目”而不是“Console应用程序”,然后转到左上菜单中的Project并选择最后一个选项(ProjectName的CMake设置)。它将打开一个json文件。在“工具集选项”下,单击下拉菜单以选择“铿锵”

在VS2019 16.1以上,Clang已经可用。如果不可用,请单击“修改”按钮 在VisualStudio安装程序和C/C++开发工具中,选择“用于windows的叮当工具”。这将安装Clang

因此,主要的事情是选择“CMake项目”而不是“控制台应用程序”,这通常不会在任何说明中显示。 VLA现在将在.cpp文件中工作,VisualStudio2019可以用作IDE,以支持VLA


这看起来像是xy问题。为什么不直接使用
std::vector
?这完全取决于编译器,而不是visual studio。CL不支持此功能,但支持更强大的功能,因此您可以使用
int*arr=(int*)\u alloca(n*sizeof(int))
(当然,您需要检查
n
的值)。vs2019还支持clang编译器工具集。这可能适用于clang(vla)
任何普通的C或C++编译器
,您确定吗?C++98或C89编译器肯定不支持这一点。MSVC、GCC、Clang和ICC并不是世界上唯一的编译器。此外,VLA不是那么好,它不再是强制性的C11@RbMm在Linux上,它是。但是请看@phuclv-我知道这一点,但不同意使用
alloca
总是不好的。对于较小的内存分配(在用户模式下高达几kb)-最好。然而,这是最接近vla的,在vla中也有分配。有些东西不能既是非法的,也不能是扩展。它是非法的,编译器支持它提供C++的变体(即,不是标准C++),或者它是合法的(虽然不是C++标准所要求的,也就是不是良好程序所需的核心语言的一部分)和扩展。这个答案并不是针对这个问题,它不是关于C或C++支持或允许的,而是关于使用Visual Studio接口和他们所选择的编译器支持的有效语言。但是我编辑了我的答案。在ISO标准和扩展中,有些东西不能同时是非法的。扩展是一种未指定但未被禁止的行为,而是标准。按照C++标准,“一致的实现可能有扩展……”所以扩展是明确允许的,而不是非法的。@ EricPostpischil错误:ISO