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

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

语法

/std:c++14
/std:c++17
/std:c++20
/std:c++latest
/std:c11
/std:c17

备注

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

C + + 标准支持

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

/std:c++14
/std:c++14选项启用由 MSVC 编译器实现的 c + + 14 标准特定功能。 此选项是编译为 c + + 的代码的默认选项。 从 Visual Studio 2015 Update 3 开始提供此功能。

此选项将禁用编译器和标准库支持,以对在较新版本的语言标准中更改或新增的功能禁用该功能。 但是,它并不会禁用以前版本的 MSVC 编译器已经实现的 c + + 17 功能。 有关详细信息,请参阅 Microsoft C/C++ 语言一致性。 表指示在指定时启用了哪些 c + + 17 功能 /std:c++14

当指定了选项时,以下功能保持启用状态 /std:c++14 ,以避免对已依赖于或在 Visual Studio 2015 Update 2 之前或之前获得功能的用户的重大更改:

/std:c++17
/std:c++17选项可启用 c + + 17 标准功能和行为。 它启用由 MSVC 编译器实现的一组完整的 c + + 17 功能。 此选项对 c + + 17 之后新增或更改的功能禁用编译器和标准库支持。 它专门禁用了 c + + 标准版和工作草案版本中的 C + + 17 更改。 它不会禁用 c + + 标准的追溯缺陷更新。 此选项从 Visual Studio 2017 15.3 版开始可用。

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

/std:c++20
/std:c++20选项可启用 c + + 20 个标准特定的功能和行为。 从 Visual Studio 2019 16.11 版开始提供,它支持由 MSVC 编译器实现的一组完整的 c + + 20 功能,除外 std::format ,c + + 20 <chrono> 格式设置扩展,以及范围工厂和范围内的适配器 <ranges> 。 这些功能仅在下可用 /std:c++latest

/std:c++20选项对 c + + 20 之后新增或更改的功能禁用编译器和标准库支持。 它专门禁用了 c + + 标准版和工作草案版本中的 C + + 20 次更改。 它不会禁用 c + + 标准的追溯缺陷更新。

/std:c++latest
/std:c++latest选项可启用所有当前实现的编译器和标准库功能,建议用于下一草案标准,以及某些正在进行的和实验性功能。 从 Visual Studio 2015 Update 3 开始,此选项可用。

如果指定选项,可能无法完全实现 c + + 17、c + + 20 或建议的 c + + 23 功能,具体取决于 MSVC 编译器版本或更新级别 /std:c++latest 。 建议使用最新版本的 Visual Studio 来实现最高标准一致性。 有关 c + + 语言和发布版本 Visual C++ 中的库一致性的概述,请参阅 Microsoft c/c + + 语言合规性。

/std:c++latest若要启用 c + + 的所有编译器和标准库功能,请在版本16.11 之前的 Visual Studio 2019 版本中使用。

有关支持的语言和库功能的列表,请参阅Visual Studio 中 c + + 的新增功能。

/std:c++latest选项不会启用交换机保护的功能 /experimental ,但可能需要启用它们。

注意

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

C 标准支持

您可以通过使用/Tc编译器选项来调用 Microsoft C 编译器。 默认情况下,它用于具有 .c 文件扩展名的代码,除非由 /TP 或选项重写 /Tp 。 默认的 C 编译器 (即,编译器 /std:c11/std:c17) 实现 ANSI C89,但不指定,但包含多个 Microsoft 扩展,其中一些扩展是 ISO C99 的一部分。 可以通过使用编译器选项来禁用一些 Microsoft C89 扩展 /Za ,但其他扩展仍有效。 无法指定严格的 C89 一致性。 编译器不会实现 C99 的多个必需功能,因此不能指定 C99 一致性。

/std:c11
/std:c11选项启用 ISO C11 一致性。 从 Visual Studio 2019 版16.8 开始提供此功能。

/std:c17
/std:c17选项启用 ISO C17 一致性。 从 Visual Studio 2019 版16.8 开始提供此功能。

由于需要新的预处理器来支持这些标准,因此 /std:c11/std:c17 编译器选项 /Zc:preprocessor 会自动设置选项。 如果要使用传统 (旧) 预处理器用于 C11 或 C17,则必须 /Zc:preprocessor- 显式设置编译器选项。 设置 /Zc:preprocessor- 选项可能会导致意外的行为,因此不建议使用此选项。

注意

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

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

当源文件具有 .c 文件扩展名时,或在指定.c编译器选项时,IDE 使用 IntelliSense 和代码突出显示的 C 设置。 目前,C 中的 IntelliSense 突出显示关键字 _Alignas_Alignof_Noreturn_Static_assert ,但不突出显示标准标头中定义的等效宏: alignasalignofnoreturnstatic_assert

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

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

  • 无一致性的多线程处理、原子或复数支持。

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

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

  • 不计划 (VLA) 支持的可变长度数组。 VLAs 提供了可与 gets (不推荐使用)和计划删除的受攻击媒介。

有关详细信息,请参阅 Microsoft c/c + + 语言一致性中的 C 标准库功能部分。

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

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

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

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

另请参阅

MSVC 编译器选项
MSVC 编译器命令行语法