Visual Studio配置(6):项目属性页-C/C++(2)
代码生成:
启用字符串池:允许编译器在执行过程中,在程序影像和内存中创建相同字符串的单个只读副本,从而生成较小的程序。
启用最小重新生成:
在首次编译期间,编译器在项目的.idb文件中存储源文件和类定义之间的依赖关系信息。 (依赖关系信息表明每个源文件所依赖的类定义以及该定义位于哪个.h 文件中。)后面的编译使用存储在.idb 文件中的信息确定是否需要编译某个源文件(即使它包含已修改的 .h 文件)。
最小重新生成依赖于类定义不会在包含文件之间更改。类定义对于项目必须是全局的(对于给定类应只有一个定义),因为.idb 文件中的依赖关系信息是为整个项目创建的。如果项目中的某个类有多个定义,请禁用最小重新生成。
由于增量链接器不支持通过使用 /ZW(Windows 运行时编译) 选项将 Windows 元数据包含在 .obj 文件中,因此 /Gm 选项与 /ZW 不兼容。
启用C++异常:/EH{s|a}[c][r][-]
a
同时捕获异步(结构化)和同步 (C++) 异常的异常处理模型。
s
仅捕获 C++ 异常并通知编译器假定声明为 extern "C" 的函数可能引发异常的异常处理模型。
c
如果与 s (/EHsc) 一起使用,则仅捕获 C++ 异常并通知编译器假定声明为 extern "C" 的函数从未引发 C++ 异常。
/EHca 与 /EHa 相等。
r
告知编译器始终为所有 noexcept 函数生成运行时终止检查。 默认情况下,如果编译器确定该函数仅调用非引发函数,则运行时检查 noexcept 可能被优化掉。
较小类型检查:启动或禁用运行时检测功能
基本运行时检测:
运行库:
/MD[d]
/ML[d]
/MT[d]
/LD[d]
选项 说明
/MD 定义_MT和_DLL以便同时从标准.h文件中选择运行时例程的多线程特定版本和 DLL 特定版本。
此选项还使编译器将库名 MSVCRT.lib 放入 .obj 文件中。
用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。
实际工作代码包含在 MSVCR71.DLL 中,该库必须在运行时对于与 MSVCRT.lib 链接的应用程序可用。
/MDd 定义 _DEBUG、_MT 和 _DLL,以便从标准 .h 文件中选择运行时例程的调试多线程特定版本和 DLL 特定版本。
它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。
/ML 使编译器将库名 LIBC.lib 放入 .obj 文件中,以便链接器使用 LIBC.lib 解析外部符号。
这是编译器的默认操作。LIBC.lib 不提供多线程支持。
/MLd 定义 _DEBUG 并使编译器将库名 LIBCD.lib 放入 .obj 文件中,以便链接器使用 LIBCD.lib 解析外部符号。
LIBCD.lib 不提供多线程支持。
/MT 定义 _MT,以便从标准头 (.h) 文件中选择运行时例程的多线程特定版本。
此选项还使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析外部符号。
创建多线程程序需要 /MT 或 /MD(或它们的调试等效选项 /MTd 或 /MDd)。
/MTd 定义 _DEBUG 和 _MT。定义 _MT 会导致从标准 .h 文件中选择运行时例程的多线程特定版本。
此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使用 LIBCMTD.lib 解析外部符号。
创建多线程程序需要 /MTd 或 /MDd(或它们的非调试等效选项 /MT 或 MD)。
/LD 创建 DLL。将 /DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。
如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。
链接 DLL 启动代码。
如果命令行上未指定导出 (.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL 的应用程序。
将 /Fe 解释为命名 DLL 而不是 .exe 文件;默认程序名成为基名称.dll 而不是基名称.exe。
如果还未显式指定 /M 选项之一,则将默认运行时库支持更改为 /MT。
/LDd 创建调试 DLL。定义 _DEBUG。
结构成员对齐 /Zp[1|2|4|8|16]
当指定此选项时,第一个结构成员后的每个结构成员将存储在成员类型大小或 n 字节边界(其中 n 为 1、2、4、8 或 16)两者中较小的一个边界上。
下表描述了可用的值。
1针对 1 字节边界将结构打包。 与 /Zp 相同。
2针对 2 字节边界将结构打包。
4针对 4 字节边界将结构打包。
8针对 8 字节边界将结构打包(默认设置)。
16针对 16 字节边界将结构打包。
除非有特定的对齐要求,否则不应使用此选项。
安全检查 /GS[-]
默认情况下,/GS 处于打开状态。 如果希望应用程序不出现安全漏洞,请使用 /GS-。
启用函数级链接 /Gy[-]
链接器要求单独打包为 COMDAT 的函数在 DLL 或 .exe 文件中排除或安排各个函数。
可以使用链接器选项 /OPT(优化) 从 .exe 文件中排除未引用的封装函数。
可以使用链接器选项 /ORDER(按顺序放置函数)按指定顺序将封装函数包括在 .exe 文件中。
如果内联函数作为调用进行实例化(例如,当关闭内联或获取函数地址时出现这种情况),则始终打包内联函数。 另外,在类声明内部定义的 C++ 成员函数会自动打包;其他函数不会如此,所以需要选择此选项以便将它们作为封装函数编译。
用于“编辑并继续”的 /ZI 选项会自动设置 /Gy 选项。
启用并行代码生成
当编译器自动对循环进行并行化代码,它在多个处理器内核之间分布的计算。 循环并行化仅当编译器确定它是以合法的方式执行,并且并行化会提高性能。
启用增强指令集
根据具体硬件的特性选择对应的CPU指令集,可以最优化速度。
浮点模型 /fp:[precise | except[-] | fast | strict ]
通过禁用可更改浮点计算精度的优化,可提高等式和不等式的浮点测试的一致性。
启用浮点异常
可靠的浮点异常模型。 异常在触发后立即引发。 默认情况下关闭此选项。 将减号追加到此选项将显式禁用它。
创建可热修补映像 /hotpatch
===============================================================================
语言
禁用语言扩展 /Za
Visual C++ 编译器提供许多在 ANSI C 或 ANSI C++ 标准中指定的那些功能以外的功能。
这些功能统称为 C 和 C++ 的 Microsoft 扩展。 这些扩展在指定 /Za 选项时不可用。
如果打算将程序移植到其他环境,请禁用语言扩展。
将WChar_t视为内置类型 /Zc:wchar_t[-]
如果 /Zc:wchar_t 处于打开状态,wchar_t 将映射到 Microsoft 专用本机类型 __wchar_t。
如果指定了 /Zc:wchar_t-(带有一个减号),wchar_t 将映射到 unsigned short 的 typedef。
C++ 标准要求 wchar_t 是内置类型。
强制For循环范围中的合规性 /Zc:forScope[-] 就是决定变量在超出for循环之后,是否还存在
启用运行时类型信息 /GR[-]
当 /GR 启用时,编译器将定义 _CPPRTTI 预处理器宏。
默认情况下,/GR 处于打开状态。
/GR- 将禁用运行时类型信息。
如果编译器无法在代码中静态解析对象类型,则使用 /GR。
当代码使用 dynamic_cast 运算符 或 typeid 时,通常需要 /GR 选项。
但是,/GR 会导致映像的 .rdata 节增大。
如果您的代码不使用 dynamic_cast 或 typeid,则使用 /GR- 可能会生成较小的映像。
OpenMP支持
#pragma omp 用于指定 Directives 和 Clauses。
如果未在编译中指定 /openmp,编译器将忽略 OpenMP 子句和指令。
即使未指定 /openmp,OpenMP 函数调用也由编译器处理。
启用字符串池:允许编译器在执行过程中,在程序影像和内存中创建相同字符串的单个只读副本,从而生成较小的程序。
启用最小重新生成:
在首次编译期间,编译器在项目的.idb文件中存储源文件和类定义之间的依赖关系信息。 (依赖关系信息表明每个源文件所依赖的类定义以及该定义位于哪个.h 文件中。)后面的编译使用存储在.idb 文件中的信息确定是否需要编译某个源文件(即使它包含已修改的 .h 文件)。
最小重新生成依赖于类定义不会在包含文件之间更改。类定义对于项目必须是全局的(对于给定类应只有一个定义),因为.idb 文件中的依赖关系信息是为整个项目创建的。如果项目中的某个类有多个定义,请禁用最小重新生成。
由于增量链接器不支持通过使用 /ZW(Windows 运行时编译) 选项将 Windows 元数据包含在 .obj 文件中,因此 /Gm 选项与 /ZW 不兼容。
启用C++异常:/EH{s|a}[c][r][-]
a
同时捕获异步(结构化)和同步 (C++) 异常的异常处理模型。
s
仅捕获 C++ 异常并通知编译器假定声明为 extern "C" 的函数可能引发异常的异常处理模型。
c
如果与 s (/EHsc) 一起使用,则仅捕获 C++ 异常并通知编译器假定声明为 extern "C" 的函数从未引发 C++ 异常。
/EHca 与 /EHa 相等。
r
告知编译器始终为所有 noexcept 函数生成运行时终止检查。 默认情况下,如果编译器确定该函数仅调用非引发函数,则运行时检查 noexcept 可能被优化掉。
较小类型检查:启动或禁用运行时检测功能
基本运行时检测:
运行库:
/MD[d]
/ML[d]
/MT[d]
/LD[d]
选项 说明
/MD 定义_MT和_DLL以便同时从标准.h文件中选择运行时例程的多线程特定版本和 DLL 特定版本。
此选项还使编译器将库名 MSVCRT.lib 放入 .obj 文件中。
用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。
实际工作代码包含在 MSVCR71.DLL 中,该库必须在运行时对于与 MSVCRT.lib 链接的应用程序可用。
/MDd 定义 _DEBUG、_MT 和 _DLL,以便从标准 .h 文件中选择运行时例程的调试多线程特定版本和 DLL 特定版本。
它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。
/ML 使编译器将库名 LIBC.lib 放入 .obj 文件中,以便链接器使用 LIBC.lib 解析外部符号。
这是编译器的默认操作。LIBC.lib 不提供多线程支持。
/MLd 定义 _DEBUG 并使编译器将库名 LIBCD.lib 放入 .obj 文件中,以便链接器使用 LIBCD.lib 解析外部符号。
LIBCD.lib 不提供多线程支持。
/MT 定义 _MT,以便从标准头 (.h) 文件中选择运行时例程的多线程特定版本。
此选项还使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析外部符号。
创建多线程程序需要 /MT 或 /MD(或它们的调试等效选项 /MTd 或 /MDd)。
/MTd 定义 _DEBUG 和 _MT。定义 _MT 会导致从标准 .h 文件中选择运行时例程的多线程特定版本。
此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使用 LIBCMTD.lib 解析外部符号。
创建多线程程序需要 /MTd 或 /MDd(或它们的非调试等效选项 /MT 或 MD)。
/LD 创建 DLL。将 /DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。
如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。
链接 DLL 启动代码。
如果命令行上未指定导出 (.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL 的应用程序。
将 /Fe 解释为命名 DLL 而不是 .exe 文件;默认程序名成为基名称.dll 而不是基名称.exe。
如果还未显式指定 /M 选项之一,则将默认运行时库支持更改为 /MT。
/LDd 创建调试 DLL。定义 _DEBUG。
结构成员对齐 /Zp[1|2|4|8|16]
当指定此选项时,第一个结构成员后的每个结构成员将存储在成员类型大小或 n 字节边界(其中 n 为 1、2、4、8 或 16)两者中较小的一个边界上。
下表描述了可用的值。
1针对 1 字节边界将结构打包。 与 /Zp 相同。
2针对 2 字节边界将结构打包。
4针对 4 字节边界将结构打包。
8针对 8 字节边界将结构打包(默认设置)。
16针对 16 字节边界将结构打包。
除非有特定的对齐要求,否则不应使用此选项。
安全检查 /GS[-]
默认情况下,/GS 处于打开状态。 如果希望应用程序不出现安全漏洞,请使用 /GS-。
启用函数级链接 /Gy[-]
链接器要求单独打包为 COMDAT 的函数在 DLL 或 .exe 文件中排除或安排各个函数。
可以使用链接器选项 /OPT(优化) 从 .exe 文件中排除未引用的封装函数。
可以使用链接器选项 /ORDER(按顺序放置函数)按指定顺序将封装函数包括在 .exe 文件中。
如果内联函数作为调用进行实例化(例如,当关闭内联或获取函数地址时出现这种情况),则始终打包内联函数。 另外,在类声明内部定义的 C++ 成员函数会自动打包;其他函数不会如此,所以需要选择此选项以便将它们作为封装函数编译。
用于“编辑并继续”的 /ZI 选项会自动设置 /Gy 选项。
启用并行代码生成
当编译器自动对循环进行并行化代码,它在多个处理器内核之间分布的计算。 循环并行化仅当编译器确定它是以合法的方式执行,并且并行化会提高性能。
启用增强指令集
根据具体硬件的特性选择对应的CPU指令集,可以最优化速度。
浮点模型 /fp:[precise | except[-] | fast | strict ]
通过禁用可更改浮点计算精度的优化,可提高等式和不等式的浮点测试的一致性。
启用浮点异常
可靠的浮点异常模型。 异常在触发后立即引发。 默认情况下关闭此选项。 将减号追加到此选项将显式禁用它。
创建可热修补映像 /hotpatch
当 /hotpatch 用于编译时,编译器确保每个函数的第一个指令为至少两个字节,这是热修补的要求。
===============================================================================
语言
禁用语言扩展 /Za
Visual C++ 编译器提供许多在 ANSI C 或 ANSI C++ 标准中指定的那些功能以外的功能。
这些功能统称为 C 和 C++ 的 Microsoft 扩展。 这些扩展在指定 /Za 选项时不可用。
如果打算将程序移植到其他环境,请禁用语言扩展。
将WChar_t视为内置类型 /Zc:wchar_t[-]
如果 /Zc:wchar_t 处于打开状态,wchar_t 将映射到 Microsoft 专用本机类型 __wchar_t。
如果指定了 /Zc:wchar_t-(带有一个减号),wchar_t 将映射到 unsigned short 的 typedef。
C++ 标准要求 wchar_t 是内置类型。
强制For循环范围中的合规性 /Zc:forScope[-] 就是决定变量在超出for循环之后,是否还存在
启用运行时类型信息 /GR[-]
当 /GR 启用时,编译器将定义 _CPPRTTI 预处理器宏。
默认情况下,/GR 处于打开状态。
/GR- 将禁用运行时类型信息。
如果编译器无法在代码中静态解析对象类型,则使用 /GR。
当代码使用 dynamic_cast 运算符 或 typeid 时,通常需要 /GR 选项。
但是,/GR 会导致映像的 .rdata 节增大。
如果您的代码不使用 dynamic_cast 或 typeid,则使用 /GR- 可能会生成较小的映像。
OpenMP支持
#pragma omp 用于指定 Directives 和 Clauses。
如果未在编译中指定 /openmp,编译器将忽略 OpenMP 子句和指令。
即使未指定 /openmp,OpenMP 函数调用也由编译器处理。
人生如戏,还是戏如人生?微信公众号:传说之路
csdn博客 http://blog.csdn.net/u012175089/article/list/2