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
文件)可用于头文件。 否则,头文件被视为普通 #include
。 header-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
内联函数扩展
选择项
- 默认值
- 禁用 - 禁用内联扩展,默认已启用。
- 仅限 __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 字节 - 在十六字节边界上打包结构。
- 默认 - 默认对齐设置。
安全检查
安全检查有助于检查堆栈缓冲区是否超负荷运行,它是一种常见的尝试攻击程序安全的命令。
选择项
控制流防护
防护安全检查帮助检测调度到非法代码块的企图。
选择项
- 是 - 使用防护集
/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 std
或import 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 是编译器警告。
其他选项
其他选项。