VC编译开关详解:/EHsc /EHa /EHc
需积分: 16 137 浏览量
更新于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编译开关对异常处理的精确性和程序的性能至关重要。开发者应根据项目的具体需求,如兼容性、性能优化和异常处理策略来决定使用哪种编译开关。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2013-11-25 上传
2012-06-14 上传
2011-09-19 上传
2015-12-09 上传
2022-09-24 上传
2011-01-26 上传
利国帝
- 粉丝: 3
- 资源: 9
最新资源
- 火炬连体网络在MNIST的2D嵌入实现示例
- Angular插件增强Application Insights JavaScript SDK功能
- 实时三维重建:InfiniTAM的ros驱动应用
- Spring与Mybatis整合的配置与实践
- Vozy前端技术测试深入体验与模板参考
- React应用实现语音转文字功能介绍
- PHPMailer-6.6.4: PHP邮件收发类库的详细介绍
- Felineboard:为猫主人设计的交互式仪表板
- PGRFileManager:功能强大的开源Ajax文件管理器
- Pytest-Html定制测试报告与源代码封装教程
- Angular开发与部署指南:从创建到测试
- BASIC-BINARY-IPC系统:进程间通信的非阻塞接口
- LTK3D: Common Lisp中的基础3D图形实现
- Timer-Counter-Lister:官方源代码及更新发布
- Galaxia REST API:面向地球问题的解决方案
- Node.js模块:随机动物实例教程与源码解析