c17 语言标准,/std(指定语言标准版本) | Microsoft Docs

/std (指定语言标准版本)

10/29/2020

本文内容

从指定版本的 C 或 C++ 语言标准中启用支持的 C 和 C++ 语言功能。

语法

/std:c++14

/std:c++17

/std:c++latest

/std:c11

/std:c17

备注

此选项 /std 在 2017 Visual Studio中可用。 它用于控制编译代码期间启用的版本特定的 ISO C 或 C++ 编程语言标准功能。 此选项允许禁用对某些新语言和库功能的支持:可能会破坏符合特定语言标准版本的现有代码的功能。

C++ 标准支持

默认情况下,指定 ,这将禁用在更高版本的 C++ 语言标准中 /std:c++14 发现的语言和标准库功能。 使用 /std:c++17 启用 C++17 标准特定的功能和行为。 若要显式启用为下一个草稿标准建议当前实现的编译器和标准库功能,请使用 /std:c++latest 。 所有 C++20 功能都需要 /std:c++latest ;实现完成后,将启用 /std:c++20 一个新选项。

默认 /std:c++14 选项启用由应用程序实现的 C++14 MSVC 编译器。 此选项禁用编译器和标准库对语言标准较新版本中更改或新增的功能的支持。 它不会禁用某些 C++17 功能,这些功能已在早期版本的 MSVC 编译器。 为了避免已依赖于 Visual Studio 2015 Update 2 或 2015 Update 2 中或之前可用的功能的用户发生中断性变更,指定 选项后,这些功能将 /std:c++14 保持启用状态:

指定可用时启用的 C++14 和 C++17 /std:c++14 功能的列表。 有关详细信息,请参阅 Microsoft c + + 语言一致性表中的说明。

/std:c++17 选项启用 MSVC 编译器实现的一组完整的 c + + 17 功能。 此选项对 c + + 17 之后新增或更改的功能禁用编译器和标准库支持。 这包括 c + + 标准的工作草稿和缺陷更新版本中的 C + + 17 更改。

/std:c++latest 选项可启用当前在编译器和库中实现的 C + + 17 语言和库功能。 这些功能可能包括 c + + 20 个工作草案的更改、c + + 17 中未包含的缺陷更新以及草案标准的实验性提议。 有关支持的语言和库功能列表,请参阅 Visual C++ 的新增功能。 /std:c++latest 选项不会启用交换机保护的功能 /experimental ,但可能需要启用它们。

重要

启用的编译器和库功能 /std:c++latest 表示可能出现在将来的 c + + 标准中的功能,以及已批准的 c + + 20 功能。 未经批准的功能可能会在不经通知的情况下进行中断性变更或删除,并按原样提供。

/std 可以通过使用 _ MSVC _ LANG预处理器宏来检测 c + + 编译过程中有效的选项。 有关详细信息,请参阅 预处理器宏。

/std:c++14 /std:c++latest 从 Visual Studio 2015 Update 3 开始提供和选项。 /std:c++17 从 Visual Studio 2017 版本15.3 开始,可以使用选项。 如上所述,某些 c + + 17 标准行为是通过选项启用的 /std:c++14 ,但所有其他 c + + 17 功能都是通过启用的 /std:c++17 。 在实现完成之前,c + + 20 功能处于启用状态 /std:c++latest 。

备注

根据 MSVC 编译器版本或更新级别,在指定选项时,c + + 17 功能可能未完全实现或完全一致 /std:c++17 。 有关 Visual C++ 中的 c + + 语言一致性概述,请参阅 Microsoft c + + 语言一致性表。

C 标准支持

默认情况下,当代码编译为 C 时,MSVC 编译器不符合特定 C 标准。 它通过多个 Microsoft 扩展实现 ANSI C89,其中一些扩展是 ISO C99 的一部分。 可以使用 编译器选项禁用某些 Microsoft 扩展, /Za 但其他扩展仍有效。 无法指定严格的 C89 一致性。

从 2019 Visual Studio版本 16.8 开始,你可以为编译为 /std:c11 /std:c17 C 的代码指定 或 。这些选项指定与 ISO C11 和 ISO C17 相对应的一致性模式。 由于需要新的预处理器来支持这些标准,因此 和 /std:c11 /std:c17 编译器选项会自动 /Zc:preprocessor 设置 选项。 如果要使用传统编译器 (C11) C17 的旧版预处理器,则必须显式设置 /Zc:preprocessor- 编译器选项。 设置 /Zc:preprocessor- 选项可能会导致意外行为,不建议这样做。

备注

在发布时,最新的 Windows SDK 和 UCRT 库尚不支持 C11 和 C17 代码。 需要预发行版本的 Windows SDK UCRT。 有关详细信息和安装说明,请参阅 在 中安装C11 和 C17 Visual Studio。

指定 或 /std:c11 /std:c17 时,MSVC 支持 C11 和 C17 的所有必需功能。 编译器选项支持以下功能:

restrict

_Noreturn 和

_Alignas、 _Alignof 和

_Generic 和

_Static_assert

当源文件具有文件扩展名或指定编译器选项时,IDE 使用 C 设置进行 IntelliSense 和代码 .c /TC 突出显示。 目前,IntelliSense 突出显示仅适用于关键字,不适用于标准标头引入的宏。

由于 C17 在很大程度上是 ISO C11 的 bug 修复版本,因此 MSVC 对 C11 的支持已包含所有相关缺陷报告。 目前,除 宏外,C11 和 C17 版本之间没有任何 __STDC_VERSION__ 区别。 对于 201112L C11,它扩展为 ,对于 201710L C17,它扩展为 。

编译器不支持 ISO C11 的任何可选功能。 C11 的这些可选功能中有几个是 C99 的必需功能,MSVC 尚未实现此功能是出于结构方面的原因。 可以使用功能测试宏(如) __STDC_NO_VLA__ 来检测各个功能的编译器支持级别。 有关 C 特定的预定义宏的详细信息,请参阅 预定义的宏。

Visual Studio 2019 版本16.8 版本中没有一致的多线程、原子或复数支持。

aligned_alloc 由于 Windows 堆实现,缺少支持。 替代方法是使用 _aligned_malloc 。

当前未实现 DR 400 支持 realloc ,因为此更改将破坏 ABI。

不计划 (VLA) 支持的可变长度数组。 可变长度数组的效率通常低于可比较的固定大小的数组。 在安全安全地实现时,与等效的堆内存分配相比,它们也是低效的。 VLAs 提供了可与 gets() (不推荐使用)和计划删除的受攻击媒介。

在 Visual Studio 开发环境中设置此编译器选项

选择 "配置属性" " > c/c + + > 语言" 属性页。

在 c + + 语言标准 (或 c, c 语言标准) 中,从下拉控件中选择要支持的语言标准,然后选择 "确定" 或 " 应用 " 保存更改。

另请参阅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值