C/C++ 属性页

在“项目”>“属性”>“配置属性”>“C/C++”下可以找到以下属性页

C/C++ 常规属性

附加包含目录

指定要添加到包含路径的一个或多个目录。 如果有多个目录,不同的目录将用分号(“;”)分隔。 设置 /I(其他 include 目录)编译器选项。

其他 #using 目录

指定一个或多个要搜索的目录,以解析传递给 #using 指令的名称。 如果有多个目录,不同的目录将用分号(“;”)分隔。 设置 /AI 编译器选项。

其他 BMI 目录

指定一个或多个要搜索的目录,以解析传递给 import 指令的名称。 如果有多个目录,不同的目录将用分号(“;”)分隔。 设置 /ifcSearchDir[path] 编译器选项。

其他模块依赖项

指定一个或多个模块,用于解析传递给 import 指令的名称。 如果有多个目录,不同的目录将用分号(“;”)分隔。 设置 /reference 编译器选项。

其他头单元依赖项

指定一个或多个头单元,用于解析传递给 import 头指令的名称。 如果有多个目录,不同的目录将用分号(“;”)分隔。 设置 /headerUnit 编译器选项。

在源中扫描模块依赖项

设置为 Yes 时,编译器会在所有 C++ 源(而不仅仅是模块接口和头单元源)中扫描模块和头单元依赖项。 生成系统会生成完整的依赖关系图,确保先生成所有导入的模块和头单元,然后再编译依赖于它们的文件。 与将 Include 转换为 Import 结合使用时,与头文件位于同一目录中的 header-units.json 文件中指定的任何头文件都将编译为头单元。

始终会扫描扩展名为.ixx的文件,以及“文件属性>”“C/C++>”“编译为”属性设置为“编译为 C++ 头单元 (/exportHeader)”的文件。

将 Include 转换为 Import

设置为 Yes 时,如果满足特定的条件,编译器会将 #include 指令视为 import 指令:头文件在同一目录中的 header-units.json 文件中指定,已编译的头单元(.ifc 文件)可用于头文件。 否则,头文件被视为普通 #includeheader-units.json 文件用于为每个 #include 生成符号不重复的头单元。 与“在源中扫描模块依赖项”结合使用时,编译器会自动查找可编译为头单元的所有头文件。 此属性设置 /translateInclude 编译器选项。

调试信息格式

指定编译器生成的调试信息的类型。 此属性需要兼容的链接器设置。 设置 /Z7/Zi/ZI(调试信息格式)编译器选项。

选择项

  • - 没有生成调试信息,因此编译可能会更快。
  • C7 兼容 - 选择为程序创建的调试信息的类型,并选择是将此信息保存在对象 (.obj) 文件中,还是保存在程序数据库 (PDB) 中
  • 程序数据库 - 生成一个程序数据库 (PDB),其中包含供调试器使用的类型信息和符号化调试信息。 符号化调试信息包含变量的名称和类型以及函数和行号。
  • 支持“编辑并继续”的程序数据库 - 如前所述,以一种支持编辑并继续功能的格式生成程序数据库。

支持“仅我的代码”调试

添加用于在此编译单元中启用仅我的代码调试的支持代码。 设置 /JMC

公共语言运行时支持

使用 .NET 运行时服务。 此开关与其他一些开关不兼容;有关详细信息,请参阅 /clr 系列开关的文档。

选择项

  • 无公共语言运行时支持 - 无公共语言运行时支持
  • 公共语言运行时支持 - 为应用程序创建可供其他 CLR 应用程序使用的元数据。 还允许应用程序使用其他 CLR 组件的元数据中的类型和数据。
  • 纯 MSIL 公共语言运行时支持 - 生成不包含本机可执行代码的纯 MSIL 输出文件,不过它可以包含编译为 MSIL 的本机类型
  • 安全 MSIL 公共语言运行时支持 - 生成纯 MSIL(不包含本机可执行代码)且可验证的输出文件

使用 Windows 运行时扩展

使用 Windows 运行时语言扩展。 设置 /ZW

取消显示启动版权标志

禁止在编译器启动时显示登录横幅,并在编译期间禁止显示信息性消息。

警告级别

选择编译器对代码错误的严格程度。 设置 /W0 - /W4

选择项

  • 关闭所有警告 - 级别 0 会禁用所有警告
  • Level1 - 级别 1 会显示严重警告。 级别 1 是命令行的默认警告级别。
  • Level2 - 级别 2 会显示所有级别 1 警告,以及严重性低于级别 1 的警告
  • Level3 - 级别 3 会显示所有级别 2 警告,以及针对生产用途建议的所有其他警告
  • Level4 - 级别 4 会显示所有级别 3 警告和信息性警告,在大多数情况下可以安全忽略
  • EnableAllWarnings - 启用所有警告,包括默认禁用的警告

将警告视为错误

将编译器警告视为错误。 对于新项目,最好在每次编译中使用 /WX。 解决所有警告,以尽量减少难以发现的代码缺陷。

警告版本

隐藏特定版本的编译器发布后引入的警告。 设置 /Wv:xx[.yy[.zzzzz]]

诊断格式

启用丰富诊断,在诊断消息中包含列信息和源上下文。

选择项

  • 插入号 - 在诊断消息中提供列信息。 此外,输出相关的源代码行并显示一个指示列有问题的插入号。
  • 列信息 - 在适用的情况下,在发出诊断的行中额外提供列号
  • 经典 - 仅输出先前的简明诊断消息和行号

SDL 检查

安全开发生命周期 (SDL) 建议的其他检查;包括启用其他安全代码生成功能,以及启用其他将安全相关警告视为错误的功能。 设置 /sdl/sdl-

多处理器编译

启用多处理器编译。 设置 /MP 编译器选项。

启用地址擦除器

使用 AddressSanitizer 工具编译和链接程序。 此属性目前支持 x86 和 x64 目标生成。 设置 /fsanitize 编译器选项。

C/C++ 优化属性

优化

选择代码优化选项;选择“自定义”可使用特定的优化选项。 设置 /Od/O1/O2

选择项

  • 自定义 - 自定义优化
  • 禁用 - 禁用优化
  • 最大优化(大小优先)- 相当于 /Os /Oy /Ob2 /Gs /GF /Gy
  • 最大优化(速度优先)- 相当于 /Oi /Ot /Oy /Ob2 /Gs /GF /Gy
  • 优化(速度优先)- 相当于 /Oi /Ot /Oy /Ob2

内联函数扩展

选择生成的内联函数扩展级别。 设置 /Ob

选择项

  • 默认值
  • 禁用 - 禁用内联扩展,默认已启用
  • 仅限 __inline - 仅扩展标记为 inline__forceinline__inline 的函数。 或者在 C++ 成员函数的类声明中定义。
  • 任何适当函数 - 扩展标记为 inline__inline 的函数,以及编译器选择的任何其他函数。 (扩展由编译器自行执行,这通常称为自动内联。)

启用内部函数

启用内部函数。 使用内部函数生成更快但可能更大的代码。 设置 /Oi

大小或速度优先

是要优先优化代码大小还是代码速度;必须启用“全局优化”。 设置 /Ot/Os

选择项

  • 优先减小代码 - 通过指示编译器优先优化大小而不是速度来最小化 EXE 和 DLL 的大小
  • 优先加快代码速度 - 通过指示编译器优先优化速度而不是大小来最大化 EXE 和 DLL 的速度。 (此值为默认值。)
  • 两者都不是 - 不优化大小和速度

省略帧指针

禁止在调用堆栈上创建帧指针。

启用纤程安全优化

在使用纤程和线程本地存储访问时启用内存空间优化。 设置 /GT

全程序优化

通过将代码生成延迟到链接时间来启用跨模块优化。 需要选择链接器选项“链接时间代码生成”。 设置 /GL

C/C++ 预处理器属性

预处理器定义

为源文件定义预处理符号。

取消定义预处理器定义

指定取消定义一个或多个预处理器。 设置 /U

取消所有预处理器定义

取消以前定义的所有预处理器值。 设置 /u

忽略标准 Include 路径

防止编译器在 INCLUDE 环境变量指定的目录中搜索 include 文件。

预处理文件

预处理 C 和 C++ 源文件,并将预处理的输出写入文件。 此选项会抑制编译,且不生成 .obj 文件。

预处理抑制行号

在没有 #line 指令的情况下进行预处理。

保留注释

抑制源代码中的注释剥离;至少需要设置一个“预处理”选项。 设置 /C

C/C++ 代码生成属性

启用字符串池

编译器仅在程序映像中创建相同字符串的一个只读副本。 这样可以使程序变得更小,这是一种称作“字符串池”的优化技术/O1/O2/ZI 自动设置 /GF 选项。

启用最小重新生成

此选项启用最小重新生成,它确定是否需要重新编译包含已更改的 C++ 类定义的 C++ 源文件,该定义存储在头 .h 文件中。

启用 C++ 异常

指定将由编译器使用的异常处理模型。

选择项

  • 对于 SEH 异常为“是”- 捕获异步(结构化)和同步 (C++) 异常的异常处理模型。 设置 /EHa
  • 是 - 仅捕获 C++ 异常并告知编译器假定外部 C 函数永不引发 C++ 异常的异常处理模型。 设置 /EHsc
  • 对于外部 C 函数为“是”- 仅捕获 C++ 异常并告知编译器假定外部 C 函数会引发 C++ 异常的异常处理模型。 设置 /EHs
  • 否 - 不处理异常

较小类型检查

启用转换为较小类型的检查,与除调试以外的任何优化类型不兼容。 设置 /RTCc

基本运行时检查

启用基本运行时错误检查,与除调试以外的任何优化类型不兼容。 设置 /RTCs/RTCu/RTC1

选择项

  • 堆栈帧 - 启用堆栈帧运行时错误检查
  • 未初始化的变量 - 使用未初始化的变量时报告
  • 两者(/RTC1,等效于 /RTCsu) - 等效于 /RTCsu
  • 默认 - 默认运行时检查

运行时库

指定运行时库以进行链接。 设置 /MT/MTd/MD/MDd

选择项

  • 多线程 - 使应用程序使用多线程静态版本运行时库
  • 多线程调试 - 定义_DEBUG_MT。 此选项还会让编译器将库名称LIBCMTD.lib放入.obj文件中,以便链接器将使用LIBCMTD.lib解析外部符号。
  • 多线程 DLL - 使应用程序使用特定于多线程和 DLL 的运行时库版本。 定义 _MT_DLL,并使编译器将库名 MSVCRT.lib 放入 .obj 文件中
  • 多线程调试 DLL - 定义 _DEBUG_MT_DLL,并使应用程序使用特定于调试多线程和 DLL 的运行时库版本。 它还会让编译器将库名称MSVCRTD.lib放入.obj文件中。

结构成员对齐

为结构成员对齐指定 1、2、4 或 8 字节边界。 设置 /Zp

选择项

  • 1 字节 - 在一字节边界上打包结构。 与 /Zp 相同。
  • 2 字节 - 在二字节边界上打包结构。
  • 4 字节 - 在四字节边界上打包结构。
  • 8 字节 - 在八字节边界上打包结构(默认值)。
  • 16 字节 - 在十六字节边界上打包结构。
  • 默认 - 默认对齐设置

安全检查

安全检查有助于检查堆栈缓冲区是否超负荷运行,它是一种常见的尝试攻击程序安全的命令。

选择项

  • 禁用安全检查 - 禁用安全检查。 设置 /GS-
  • 启用安全检查 - 启用安全检查。 设置 /GS

控制流防护

防护安全检查帮助检测调度到非法代码块的企图。

选择项

  • 是 - 使用防护集 /guard:cf 启用安全检查。

启用函数级别链接

允许编译器以打包函数 (COMDAT) 形式对各个函数进行打包。 需进行此操作后才能编辑并继续工作。 设置 /Gy

启用并行代码生成

启用优化时,允许编译器为使用 #pragma loop(hint_parallel[(n)]) 标识的循环生成并行代码。

启用增强的指令集

启用在支持增强指令集的处理器上找到的指令。 例如,对 IA-32 的 SSE、SSE2、AVX 和 AVX2 增强。 以及对 x64 的 AVX 和 AVX2 增强。 目前仅在为 x86 体系结构生成时可以使用 /arch:SSE/arch:SSE2。 如果未指定选项,编译器使用在支持 SSE2 的处理器上找到的指令。 可以使用 /arch:IA32 禁用增强的指令。 有关详细信息,请参阅/arch (x86), /arch (x64), /arch (ARM64)/arch (ARM).

选择项

  • 流式处理 SIMD 扩展 - 流式处理 SIMD 扩展。 设置 /arch:SSE
  • 流式处理 SIMD 扩展 2 - 流式处理 SIMD 扩展 2。 设置 /arch:SSE2
  • 高级向量扩展 - 高级向量扩展。 设置 /arch:AVX
  • 高级向量扩展 2 - 高级向量扩展 2。 设置 /arch:AVX2
  • 无增强的指令 - 无增强的指令。 设置 /arch:IA32
  • 未设置 - 未设置

浮点模型

设置浮点模型。 设置 /fp:precise/fp:strict/fp:fast

选择项

  • 精确 - 默认设置。 改善相等性和不相等性的浮点测试一致性。
  • 严格 - 最严格的浮点模型/fp:strict 会导致关闭 fp_contract,并打开 fenv_access/fp:except 是隐式使用的,可以通过显式指定 /fp:except- 来禁用。 与 /fp:except- 一起使用时,/fp:strict 将强制执行严格的浮点语义,但不考虑异常事件。
  • 快速 - 在大多数情况下创建最快的代码

启用浮点异常

可靠的浮点异常模型。 异常将在触发后立即引发。 设置 /fp:except

创建可热修补的映像

启用热修补时,编译器可确保每个函数的第一条指令为两个字节,这是热修补所需的。 设置 /hotpatch

Spectre 缓解措施

CVE 2017-5753 的 Spectre 缓解措施。 设置 /Qspectre

选择项

  • 启用 - 为 CVE 2017-5753 启用 Spectre 缓解功能
  • 禁用 - 未设置

C/C++ 语言属性

禁用语言扩展

抑制或启用语言扩展。 设置 /Za

将 WChar_t 视为内置类型

指定后,类型 wchar_t 将成为映射到 __wchar_t 的本机类型,如同 short 映射到 __int16 一样。 /Zc:wchar_t 处于打开状态。

强制 For 循环范围内的遵从性

使用 Microsoft 扩展为 for 语句循环实现标准 C++ 行为。 设置 /Za/Ze(禁用语言扩展)。 /Zc:forScope 处于打开状态。

删除未引用的代码和数据

指定后,编译器不再为未引用的代码和数据生成符号信息。

强制实施类型转换规则

用于根据 C++11 标准将 rvalue 引用类型识别为强制转换操作的结果。

启用运行时类型信息

添加在运行时检查 C++ 对象类型(运行时类型信息 (RTTI))的代码。 设置 /GR/GR-

打开 MP 支持

启用 OpenMP 2.0 语言扩展。 设置 /openmp

C++ 语言标准

确定编译器启用的 C++ 语言标准。 默认值不会设置标准选项,因此编译器使用其默认 C++14 设置。 如果你选择特定的值,则对应的 /std 编译器选项为 set.md。

选择项

  • 默认(ISO C++14 标准)
  • ISO C++14 标准 (/std:c++14)
  • ISO C++17 标准 (/std:c++17)
  • ISO C++20 标准 (/std:c++20)
  • 预览 - 最新 C++ 工作草案中的功能(/std:c++latest)

C 语言标准

确定编译器启用的 C 语言标准。 默认值不会设置标准选项,因此编译器使用其默认的旧版 MSVC 设置。 如果你选择特定的值,则对应的 /std 编译器选项为 set.md。

选择项

  • 默认(旧版 MSVC)
  • ISO C11 标准 (/std:c11)
  • ISO C17 (2018) 标准 (/std:c17)

遵从性模式

启用或抑制遵从性模式。 设置 /permissive-

启用实验性的 C++ 标准库模块

对 C++ 模块 TS 和标准库模块的试验性支持。

生成 ISO C++23 标准库模块

从 Visual Studio 17.6 开始,启用此属性且C++ 语言标准设置为/std:c++latest后,Visual C++ 项目会自动查找并生成 ISO C++23 标准库模块。 这使你能够在 C++ 代码中import stdimport std.compat

C/C++ 预编译头属性

创建/使用预编译头

在生成期间启用创建或使用预编译标头。 设置 /Yc/Yu

选择项

  • 创建 - 指示编译器创建一个预编译头 (.pch) 文件,该文件表示特定点的编译状态
  • 使用 - 指示编译器在当前编译中使用现有的预编译头 (.pch) 文件。
  • 不使用预编译头 - 不使用预编译头

预编译标头文件

指定在创建或使用预编译头文件时要使用的头文件名称。 设置 /Yc/Yu

预编译头输出文件

指定已生成的预编译头文件的路径或名称。 设置 /Fp

C/C++ 输出文件属性

扩展特性源

创建列表文件并将扩展的特性注入源文件。 设置 /Fx

汇编程序输出

指定汇编语言输出文件的内容。 设置 /FA/FAc/FAs/FAcs

选择项

  • 无列表 - 无列表。
  • 仅程序集列表 - 程序集代码;.asm
  • 程序集和计算机代码 - 计算机和程序集代码;.cod
  • 程序集和源代码 - 源代码和程序集代码;.asm
  • 程序集、计算机代码和源代码 - 程序集、计算机代码和源代码;.cod

将 Unicode 用于程序集列表

以 UTF-8 格式创建输出文件。

ASM 列表位置

指定 ASM 列表文件的相对路径或名称;可以是文件名或目录名。 设置 /Fa

对象文件名

指定一个名称以替代默认对象文件名;可以是文件或目录名。 设置 /Fo

程序数据库文件名

指定编译器生成的 PDB 文件的名称;此外,为所需的编译器生成的 IDB 文件指定基本名称;可以是文件名或目录名。 设置 /Fd

生成 XML 文档文件

指定编译器应生成 XML 文档注释文件 (.XDC)。 设置 /doc

XML 文档文件名

指定生成的 XML 文档文件的名称;可以是文件名或目录名。 设置 /doc:<名称>

C/C++ 浏览信息属性

启用浏览信息

指定 .bsc 文件中的浏览信息级别。 设置 /FR

浏览信息文件

指定浏览器信息文件的可选名称。 设置 /FR<名称>

外部包含

将包含在尖括号中的文件视为外部文件

指定是否将尖括号包含的文件视为外部文件。 将此属性设置为 Yes 可设置 /external:anglebrackets 编译器选项。

外部头警告级别

选择编译器对外部头中的代码错误的严格程度。 此属性设置 /external:Wn 编译器选项。 如果将此值设置为“继承项目警告级别”或默认值,则会忽略其他 /external 选项。

外部头中的模板诊断

指定是否在整个模板实例化链中评估警告级别。 将此属性设置为 Yes 可设置 /external:templates- 编译器选项。

对外部头禁用代码分析

对外部头禁用代码分析。 设置 /analyze:external- 编译器选项。

针对外部头的分析规则集

针对外部头指定代码分析规则集重写。 如果未指定,则使用代码分析设置。 设置 /analyze:external:ruleset path 编译器选项。

C/C++ 高级属性

调用约定

为应用程序选择默认调用约定(可由函数重写)。 设置 /Gd/Gr/Gz/Gv

选择项

  • __cdecl - 为除 C++ 成员函数以及标记为 __stdcall__fastcall 的函数以外的所有其他函数指定 __cdecl 调用约定。
  • __fastcall - 为除 C++ 成员函数以及标记为 __cdecl__stdcall 的函数以外的所有其他函数指定 __fastcall 调用约定。 所有 __fastcall 函数都必须有原型。
  • __stdcall - 为除 C++ 成员函数以及标记为 __cdecl__fastcall 的函数以外的所有其他函数指定 __stdcall 调用约定。 所有 __stdcall 函数都必须有原型。
  • __vectorcall - 为除 C++ 成员函数以及标记为 __cdecl__fastcall__stdcall 的函数以外的所有其他函数指定 __vectorcall 调用约定。 所有 __vectorcall 函数都必须有原型。

编译为

选择源文件的编译语言选项。 设置/TC/TP/interface/internalPartition/exportHeader选项。

选择项

  • 默认 - 默认代码
  • 编译为 C 代码 (/TC) - 将指定的源文件编译为 C 代码。 默认情况下,扩展名为.c的文件编译为 C。
  • 编译为 C++ 代码 (/TP) - 将指定的源文件编译为 C++ 代码。 默认情况下,无.c.ixx.cppm.h或扩展名的所有文件都编译为 C++。
  • 编译为 C++ 模块代码 (/interface) - 将指定的源文件编译为 C++ 模块代码。 默认情况下,具有.ixx.cppm扩展名的文件编译为 C++ 模块代码。
  • 编译为 C++ 模块内部分区 (/internalPartition) - 将指定的源文件编译为 C++ 模块内部分区。
  • 编译为 C++ 标头单元 (/exportHeader) - 将指定的源文件编译为 C++ 标头单元。 默认情况下,扩展名为.h或无扩展名的文件编译为标头单元。

禁用特定的警告

禁用指定的警告编号。 将警告编号放入分号分隔的列表中。 设置 /wd<编号>

强制 Include 文件

一个或多个强制包含文件。 设置 /FI<名称>

强制 #using 文件

指定一个或多个强制 #using 文件。 设置 /FU<名称>

显示包含文件

生成包含文件的列表及编译器输出。 设置 /showIncludes

使用完整路径

在诊断消息中使用完整路径。 设置 /FC

省略默认库名称

不在 .obj 文件中包含默认库名称。 设置 /Zl

内部编译器错误报告

注意

此选项已弃用。 从 Windows Vista 开始,错误报告由 Windows 错误报告 (WER) 设置控制。

将特定警告报告为错误

将特定编译器警告视为错误,其中的 n 是编译器警告。

其他选项

其他选项。