【问题标题】:How to use Visual Studio as an IDE with variable length array(VLA) working?如何将 Visual Studio 用作具有可变长度数组(VLA)工作的 IDE?
【发布时间】:2020-02-16 03:51:41
【问题描述】:

在 C 或 C++ 的任何普通编译器中,可变长度数组都可以正常工作,但在 Visual Studio Community 2019 中,VLA 无法正常工作。我怎样才能以任何方式将 Visual Studio 用作 IDE(因为我喜欢它的功能)并且仍然在 C 和 C++ 中使用 VLA

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

int n;
cin>>n;
int arr[n]; // This line gives an error

int arr[n]; //这行应该在Visual Studio 2019中可以工作,没关系 它使用什么编译器。只是我需要让这个东西在 VS Community 2019 中工作 因为我想把它用作 IDE。

【问题讨论】:

  • 这看起来像是一个 xy 问题。为什么不直接使用std::vector 呢?
  • 这不依赖于 Visual Studio(完全),而是依赖于编译器。 CL不支持这个,但是支持更大的功率_alloca所以你可以使用int* arr = (int*)_alloca(n * sizeof(int))(当然你需要检查n的值)。 vs2019 还支持 clang 编译器工具集。可能与 clang (vla) 一起工作
  • any normal compiler for C or C++ 你确定吗?绝对 C++98 或 C89 编译器不会支持它。并且 MSVC、GCC、Clang、ICC 并不是世界上唯一的编译器。此外 VLA 不太好,以至于在 C11 中不再是强制性的
  • @phuclv - 我知道这一点,但不同意使用alloca总是不好。对于小内存分配(在用户模式下最多几个 kb) - 最好的。然而,这是最接近 vla,分配也在堆栈中

标签: c++ c visual-studio variable-length-array


【解决方案1】:

这个答案是关于 C++ 的。

可变长度数组不是 ISO C++ 标准,一些编译器接受它作为扩展。 例如gcc

在 ISO C99 中允许使用可变长度自动数组,并作为 扩展 GCC 在 C90 模式和 C++ 中接受它们。


编辑

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


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

如果您在编译时不知道大小并想使用 C++,请使用 std::vector。您只需将代码更改为:

int n;
cin>>n;
vector<int> arr(n);

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

MSVC 不在列表中。所以你可以在你的VS中使用clang。这是tutorial。 或者,您可以更轻松地在 VS2019 上使用开箱即用的支持:

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

【讨论】:

  • 某事不能既是非法的又是扩展名。它要么是非法的,并且支持它的编译器提供了 C++ 的变体(即不是标准 C++),要么是合法的(尽管 C++ 标准不要求,即不是格式良好所需的核心语言的一部分程序)和扩展。这个答案并没有说明问题,这不是关于 C 或 C++ 支持或允许什么,而是关于使用 Visual Studio 界面和他们选择的编译器支持的有效语言。
  • @EricPostpischil 我以为我们在谈论 iso。我编辑了我的答案。
  • 某些东西在 ISO 标准和扩展中不能是非法的。扩展是未指定但未禁止的行为,而是标准。根据 C++ 标准,“符合标准的实现可能有扩展......”所以扩展是明确允许的,而不是非法的。
  • @EricPostpischil " 错误:ISO C++ 禁止变长数组 'arr' [-Wvla] 9 | int arr[n];"也许我错过了禁止的意思。 wandbox.org/permlink/w3EewWvhKtMKzkix
  • 感谢您的回答,但我实际上做了所有的研究,也已经了解了 clang。问题是我无法从编译器列表中选择 clang,因为它在列表中不可用。刚才我通过搜索解决了这个问题,发现我们需要制作一个 CMake 项目而不是控制台应用程序。在项目属性中有一个选择 Clang 的选项。现在 VLA 正在工作。
【解决方案2】:

在任何普通的 C 或 C++ 编译器中,可变长度数组都可以正常工作

根据我如何阅读这句话,它要么是同义反复,要么是荒谬的。是的,正常的事情正常工作,但 VLA 数组在 C++ 中“工作”只是因为它们不是由语言定义的。

VLA 由 C 定义,已经有 20 年的历史了。而且,是的,许多 C 编译器——但不是 C++ 编译器——都支持它们。一个明显的例外是微软的编译器,它没有。它不符合 C99 标准(更不用说 C11、C14 或 C17)。你可以说他们有点落后。他们的立场似乎是,他们将在 C++ 编译器的上下文中实现尽可能多的 C 语言。那些不属于 C++ 的 C 部分不符合条件。

这很清楚:保持 C 编译器最新不是 Microsoft 的优先事项。

只是我需要让这个东西在 VS Community 2019 中工作,因为我想将它用作 IDE。

简单的事实是,如果你想使用现代 C 语言工作,你就不能使用微软的编译器。您或许能够弄清楚如何配置 IDE 以使用 GNU 编译器。但是,在某些时候,您可能会开始询问是否值得花时间与一个对您的目标如此敌对的系统进行斗争。

【讨论】:

  • 我觉得你的回答有点误导。为什么你会认为系统是敌对的?自 19 年 3 月以来,Visual Studio 内置了对 Clang 的支持,它确实支持 C11/C14/C17(我相信在编写 C2X 时)*。只需更改 VS 项目文件中的工具集即可。注意:C11+ 支持意味着支持较新的语法结构。遗憾的是,标准库仍然过时,但可以使用 musl 轻松补充。
  • @JulianKirsch,你可能是对的。也许“敌对”太强了。不支持?不感兴趣?冷漠? Microsoft 可能实际上并不对任何使用 C 编程的人怀有敌意,但鉴于 20 多年来缺乏支持,可以说他们不在乎。请注意,OP 确实提到了 IDE 问题与编译器无关。所以,是的,您可以使用不同的编译器,但不能使用 IDE 中的整个语言。 IMO,诸如此类的问题就是发明 emacs 的原因。
  • 我猜整个东西都已经过时了:devblogs.microsoft.com/cppblog/… TL;DR:MSVC 很快就会支持 C11 和 C17(也就是非正式的 C18)
  • @JulianKirsch,非常感谢您的提醒!不过,我注意到了细则:“精明的读者会注意到也不支持 VLA。”然后,他喋喋不休地谈论 100% 的关于安全性和性能的虚假声明,IMO 只是关于微软客户需求和需求的商业决策的烟幕,更不用说微软本身了。
  • @Julian Kirsch:我就是这么想的。但是,即使我启用了与 VS2019 Pro 中的“/c++latest”一致的 C 语言标准“ISO C17 (2018)-Standard (/std:c17)”,仍然不支持可变长度数组。似乎是一个可悲的事实!
【解决方案3】:

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

在 VS2019 16.1 以上,Clang 已经可用。如果不可用,点击“修改”VS2019 在 Visual Studio 安装程序和 C/C++ 开发工具中,选择“Clang tools for windows”。这将安装 Clang。

所以主要是选择“CMake 项目”而不是“控制台应用程序”,这通常不会在任何说明中显示。 VLA 现在可以在 .cpp 文件中使用,Visual Studio 2019 可以用作 IDE 将支持 VLA。

https://devblogs.microsoft.com/cppblog/clang-llvm-support-in-visual-studio/

【讨论】:

  • CMake 与可变长度数组有什么关系?这是一个有趣的交联。
猜你喜欢
  • 2011-07-11
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2018-07-05
  • 2015-05-19
  • 2019-11-19
  • 2019-06-20
  • 1970-01-01
相关资源
最近更新 更多