VC编译开关详解:/EHsc /EHa /EHc
需积分: 16 6 浏览量
更新于2024-09-11
收藏 3KB TXT 举报
"VC编译开关的详细解析与使用"
在C++编程中,Visual C++(VC)提供了一系列的编译开关来控制异常处理行为。这些开关包括/EHsc、/EHa和/EHc,它们分别对应不同的异常处理策略,对程序的异常处理性能和兼容性有着显著影响。
/EHsc 是默认的异常处理模式,它支持C++标准的异常处理,并且在 extern "C" 的函数中处理C++异常。在这种模式下,编译器会生成标准的C++异常处理代码,只捕获C++类型的异常。如果在extern "C"的函数中抛出C++异常,编译器将尝试转换为C异常,这样C++代码可以捕获C异常。然而,如果C函数内部抛出的是C++异常,/EHsc可能会导致程序崩溃,因为它无法正确处理这种情况。
/EHa 支持所有的异常处理,包括C++异常和结构化异常处理(SEH)。它允许在C++代码中捕获C++异常以及Windows API中的结构化异常,如访问违规(Access Violation)。使用/EHa时,即使在extern "C"的函数中,也可以捕获C++异常,但不转换为C异常。这可能导致跨语言异常传递的问题,因为C++代码可能无法理解非C++类型的异常。
/EHc 只处理C++异常,同时禁止在extern "C"的函数中处理C++异常。这意味着,如果在extern "C"的函数中抛出C++异常,程序将终止,因为它不会尝试转换为C异常。此选项通常用于优化性能,因为它避免了处理C++异常的额外开销。
在构建项目时,这些开关可以通过设置CMake的CMAKE_CXX_FLAGS变量来应用。例如,以下代码片段展示了如何在MSVC环境下设置编译选项:
```cmake
if(MSVC)
set(CMAKE_CXX_FLAGS "/Zc:wchar_t- /GR /EHsc /DWIN32 /D_WINDOWS /D_SCL_SECURE_NO_WARNINGS")
else()
# ... 其他平台的配置 ...
endif()
```
这段CMake脚本不仅设置了/EHsc开关,还包含了其他一些编译选项,如/Zc:wchar_t-(禁用wchar_t为内置类型),/GR(启用运行时类型信息),以及安全相关的定义。
对于非MSVC环境(如GCC),则需要使用不同的编译选项,如-Wall(开启所有警告),-fvisibility=hidden(默认隐藏符号),以及针对优化和调试的选项。
在优化方面,GCC提供了类似-Os(优化体积)和-Wno-strict-aliasing(禁用严格的别名分析警告)的选项。而在非Apple的Unix系统上,可能需要额外的链接器选项,如-Wl,--hash-style=gnu,来改变符号哈希的风格。
选择合适的VC编译开关对异常处理的精确性和程序的性能至关重要。开发者应根据项目的具体需求,如兼容性、性能优化和异常处理策略来决定使用哪种编译开关。
2015-07-28 上传
2011-01-26 上传
2013-11-25 上传
2012-06-14 上传
2011-09-19 上传
2015-12-09 上传
2022-09-24 上传
2022-09-21 上传
2009-05-23 上传
利国帝
- 粉丝: 3
- 资源: 9
最新资源
- 探索AVL树算法:以Faculdade Senac Porto Alegre实践为例
- 小学语文教学新工具:创新黑板设计解析
- Minecraft服务器管理新插件ServerForms发布
- MATLAB基因网络模型代码实现及开源分享
- 全方位技术项目源码合集:***报名系统
- Phalcon框架实战案例分析
- MATLAB与Python结合实现短期电力负荷预测的DAT300项目解析
- 市场营销教学专用查询装置设计方案
- 随身WiFi高通210 MS8909设备的Root引导文件破解攻略
- 实现服务器端级联:modella与leveldb适配器的应用
- Oracle Linux安装必备依赖包清单与步骤
- Shyer项目:寻找喜欢的聊天伙伴
- MEAN堆栈入门项目: postings-app
- 在线WPS办公功能全接触及应用示例
- 新型带储订盒订书机设计文档
- VB多媒体教学演示系统源代码及技术项目资源大全