/std
选项在 Visual Studio 2017 及更高版本中提供。 它们用于控制在编译代码期间启用的特定于版本的 ISO C 或 C++ 编程语言标准功能。 这些选项可禁用对某些新语言和库功能的支持;可能会破坏符合特定语言标准版本的现有代码的功能。
Visual Studio 2017 及更高版本中的 Microsoft C++ 编译器不支持早于 C++14 (
/std:c++14
) 的 C++ 标准模式。 未计划此类支持。 作为一种不完美的解决方法,可以使用较旧的 Visual C++ 编译器工具集,这些工具集未根据更高标准实现功能。 有关如何在 Visual Studio 中安装和使用旧编译器工具集的详细信息,请参阅
使用 Visual Studio 中的本机多目标来生成旧项目
。
C++ 标准支持
可以使用
_MSVC_LANG
预处理器宏来检测在 C++ 编译期间有效的
/std
选项。 有关详细信息,请参阅
预处理器宏
。
/std:c++14
/std:c++14
选项启用由 MSVC 编译器实现的 C++14 标准特定功能。 对于编译为 C++ 的代码,此选项是默认选项。 自 Visual Studio 2015 Update 3 起可用。
此选项禁用编译器和标准库对语言标准更新版本中更改或新增的功能的支持。 但不会禁用 MSVC 编译器的先前版本中已经实现的某些 C++17 功能。 有关详细信息,请参阅
Microsoft C/C++ 语言一致性
。 这些表指示在你指定
/std:c++14
时启用了哪些 C++17 功能。
为避免对已经依赖 Visual Studio 2015 Update 2 中可用功能的用户进行中断性更改,在指定
/std:c++14
选项时,以下功能仍保持启用状态:
针对
auto
的规则,含大括号内的初始值列表
template-parameters 模板中的
typename
删除三字符组
命名空间和枚举器的属性
u8 字符文本
/std:c++17
/std:c++17
选项启用 C++17 特定于标准的功能和行为。 此选项启用 MSVC 编译器实现的整组 C++17 功能。 此选项禁用编译器和标准库对 C++17 之后新增或更改的功能的支持。 此选项特意禁用了 C++ 标准和工作草案版本中 C++17 后的更改。 此选项不会禁用 C++ 标准的追溯缺陷更新。 此选项自 Visual Studio 2017 版本 15.3 起可用。
根据 MSVC 编译器版本或更新级别,当指定
/std:c++17
选项时,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 开始可用。
根据 MSVC 编译器版本或更新级别,当指定
/std:c++latest
选项时,C++17、 C++20 或建议的 C++23 功能可能无法完全实现或完全符合。 我们建议你使用最新版本的 Visual Studio 以获得最大的标准一致性。 有关 Visual C++ 中 C++ 语言一致性的概述(按发布版本),请参阅
Visual C++ 语言一致性
。
在版本 16.11 之前的 Visual Studio 2019 版本中,需要
/std:c++latest
才能启用 C++20 的所有编译器和标准库功能。
有关支持的语言和库功能列表,请参阅
Visual Studio 中 C++ 的新增功能
。
/std:c++latest
选项不启用由
/experimental
开关保护的功能,但可能需要启用它们。
由
/std:c++latest
启用的编译器和库功能可能会出现在未来的 C++ 标准中。 未经批准的功能可能会在不经通知的情况下进行中断性变更或删除,并按原样提供。
C 标准支持
可以使用
/TC
或
/Tc
编译器选项来调用 Microsoft C 编译器。 默认情况下是由文件扩展名为
.c
的代码将使用,除非被
/TP
或
/Tp
选项覆盖。 默认的 C 编译器(即未指定
/std:c11
和
/std:c17
时的编译器)实现 ANSI C89,但包括几个 Microsoft 扩展,其中一些是 ISO C99 的一部分。 可以使用
/Za
编译器选项禁用 C89 的某些 Microsoft 扩展,但其他扩展仍然有效。 无法指定严格的 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
编译器选项支持以下功能:
_Pragma
restrict
_Noreturn
和 <stdnoreturn.h>
_Alignas
、
_Alignof
和 <stdalign.h>
_Generic
和 <tgmath.h>
_Static_assert
当源文件的文件扩展名为
.c
或用户指定了
/TC
或
/Tc
编译器选项时,IDE 将 C 设置用于 IntelliSense 和代码突出显示。 目前,C 中的 IntelliSense 突出显示关键字
_Alignas
、
_Alignof
、
_Noreturn
和
_Static_assert
,但不突出标准头文件中定义的等效宏:
alignas
、
alignof
、
noreturn
和
static_assert
。
由于 C17 主要是 ISO C11 的错误修复版本,因此 MSVC 对 C11 的支持已经包含所有相关的缺陷报告。 除了
__STDC_VERSION__
宏之外,C11 和 C17 版本之间没有区别。 对于 C11,扩展到
201112L
,对于 C17,扩展到
201710L
。
编译器不支持 ISO C11 的大多数可选功能。 C11 的部分可选功能中有几个是 C99 的必需功能,但由于架构原因,MVSC 尚未实现这些功能。 你可以使用
__STDC_NO_VLA__
等功能测试宏来检测各个功能的编译器支持级别。 有关特定于 C 的预定义宏的更多信息,请参阅
预定义宏
。
不存在一致的多线程、原子或复数支持。
由于 Windows 堆实现,因此缺少
aligned_alloc
支持。 替代方法是使用
_aligned_malloc
。
缺陷报告 400
支持目前未实现
realloc
,因为此更改会中断 ABI。
尚未规划可变长度数组 (VLA) 支持。 VLA 提供的攻击向量与
gets
相当,但后者已被弃用并计划移除。
有关详细信息,请参阅
Microsoft C/C++ 语言一致性
的“C 标准库功能”部分。
在 Visual Studio 开发环境中设置此编译器选项
打开项目的“属性页” 对话框。 有关详细信息,请参阅
在 Visual Studio 中设置 C++ 编译器和生成属性
。
选择“配置属性”>“C/C++”>“语言”属性页。
在“C++ 语言标准”中(对于 C,则为 C 语言标准),从下拉控件中选择要支持的语言标准,然后选择“确定”或“应用”以保存更改。
MSVC 编译器选项
MSVC 编译器命令行语法