【C/C++】VC项目 启用C++异常选项 /EHa /EHsc /EHs 有什么区别,不同编译选择的dll在一个程序中相互调用是否会引发类似崩溃的故障

VC项目 启用C++异常选项 /EHa /EHsc /EHs 有什么区别,不同编译选择的dll在一个程序中相互调用是否会引发类似崩溃的故障?

在Visual C++中,不同的异常处理模型通过编译器选项 /EHa/EHsc/EHs 进行控制。这些选项会影响编译器如何生成与异常处理相关的代码,以及运行时如何处理异常。下面是这些选项的区别:

  1. /EHa:

    • 启用 C++ 异常处理。
    • 允许抛出和捕获 C++ 异常。
    • 是默认的异常处理模型。
    • 当与 /clr (Common Language Runtime) 选项一起使用时,它可以处理托管代码中的 C++ 异常。
  2. /EHsc:

    • 类似于 /EHa,启用 C++ 异常处理并允许抛出和捕获 C++ 异常。
    • 在某些情况下,与 /EHa 相比,可能会产生更优化的代码。
    • 通常用于提高性能,尤其是在不需要经常抛出异常的情况下。
  3. /EHs:

    • 启用 C++ 异常处理。
    • 允许抛出和捕获 C++ 异常。
    • 当与 /clr 选项一起使用时,意味着程序在托管和非托管代码之间切换,并且需要支持 C++ 异常处理。
    • 如果与 /clr 一起使用,那么 C++ 异常会被转换成托管异常。
  4. /EHs-:

    • 禁止 C++ 异常处理。
    • 如果在此模式下尝试抛出异常,程序将终止。

不同编译选择的DLL相互调用

当你有多个 DLL 或可执行文件(EXE),并且它们使用了不同的异常处理模型时,可能会遇到问题。这里有一些关键点需要注意:

  • 兼容性: 如果一个 DLL 使用 /EHa/EHsc 编译,而另一个 DLL 或 EXE 使用相同的选项编译,通常情况下它们是可以互操作的。

  • 混合模式(Managed and Unmanaged Code): 当你有一个 DLL 使用 /EHs 编译,并且该 DLL 与使用 /clr 的应用程序交互时,C++ 异常会被转换成托管异常。这意味着如果一个 DLL 中抛出了一个 C++ 异常,而这个异常被托管代码捕获,那么异常将会被转换成托管形式。

  • 不兼容的情况: 如果一个 DLL 使用 /EHs- 编译,而另一个 DLL 或 EXE 使用 /EHa/EHsc 编译,那么在 DLL 之间抛出异常时可能会出现问题。例如,如果从 /EHs- 编译的 DLL 抛出异常到 /EHa 编译的应用程序,应用程序将无法正确捕获异常,并可能导致崩溃。

实践建议

  • 尽量保持一致的异常处理模型。
  • 如果需要使用混合模式编程,确保了解异常如何在托管和非托管代码之间转换。
  • 在编写跨 DLL 的异常安全代码时,考虑使用 RAII(Resource Acquisition Is Initialization)技术来管理资源。

如果你需要更具体的指导,比如如何配置 Visual Studio 项目的编译选项,或者遇到特定的问题,请提供更多的细节。

/EHsc 与 /clr不兼容

您提到的 /EHsc 选项与 /clr 选项之间的不兼容性是指在使用 Microsoft Visual C++ 编译器时的一个特殊情况。

/EHsc 选项:

  • 允许 C++ 异常处理。
  • 提供更高效的异常处理机制,特别是在不需要频繁抛出异常的情况下。
  • 与 /EHa 相比,它可能生成更优化的代码。

/clr 选项:

  • 指示编译器生成 Common Language Runtime (CLR) 兼容的代码。
  • 允许 C++ 代码与其他 .NET 语言(如 C# 和 VB.NET)的代码混合使用。
  • 当与 /clr 一起使用时,C++ 异常会转换为 .NET 异常。

/EHsc 与 /clr 的不兼容性: 当使用 /clr 选项时,C++ 异常需要转换为 .NET 异常,以便能够在 .NET Framework 中正确地处理。然而,/EHsc 选项与 /clr 选项并不完全兼容,因为它不支持这种转换。具体来说,/EHsc 不支持 C++ 异常到 .NET 异常的转换,这意味着在使用 /clr 的项目中不能直接使用 /EHsc

因此,如果您想要编写同时使用 C++ 和 .NET 的代码,您应该使用 /EHa 作为异常处理模型,这样 C++ 异常可以被转换为 .NET 异常。例如,在 Visual Studio 中创建一个支持 CLR 的 C++ 项目时,默认情况下会使用 /EHa 而不是 /EHsc

总结一下:

  • 如果您的代码仅使用标准 C++,那么 /EHsc 可能是一个好的选择。
  • 如果您的代码需要与 .NET 代码互操作,则应使用 /EHa
  • 当使用 /clr 时,不要使用 /EHsc,因为它不支持 C++ 异常到 .NET 异常的转换。

如果您需要进一步的帮助或者有其他相关问题,请告诉我。

但是我的其他项目都是/EHsc 模式编译的,这个项目与其他项目有相互调用的情况,是否会因此引发一些不可预期的故障?

当您的项目中使用了不同的异常处理模型时,确实可能会遇到一些问题。特别是当这些项目之间互相调用并且使用了不同的异常处理模式时,您需要特别小心。下面是一些潜在的问题和建议:

使用 /EHsc 的项目与使用 /clr 的项目互相调用时的问题:

  1. 异常转换问题:

    • 如果从一个使用 /EHsc 的项目抛出异常,并且该异常被传递到使用 /clr 的项目中,那么由于 /EHsc 不支持向 .NET 异常的转换,这可能导致异常无法被正确捕获和处理。
    • 同样,如果一个使用 /clr 的项目抛出 .NET 异常,并且该异常被传递到使用 /EHsc 的项目中,那么后者可能无法识别这种类型的异常。
  2. 异常兼容性:

    • 使用 /EHsc 的项目可能没有适当的功能来处理来自 .NET 的异常,反之亦然。
    • 这可能导致运行时错误,比如异常未被捕获或者处理不当导致程序崩溃。

解决方案:

  1. 统一异常处理模型:

    • 最简单的解决方法是在所有涉及交互的项目中使用相同的异常处理模型。如果您的项目需要与 .NET 代码互操作,那么使用 /EHa 是一个更好的选择,因为它支持 .NET 和 C++ 异常的转换。
    • 如果所有项目都迁移到 /EHa,那么异常可以平滑地在不同项目间传递,而不会出现类型不匹配的问题。
  2. 显式转换:

    • 如果无法更改所有项目的异常处理模型,那么可以在接口层上实现显式的异常转换。
    • 您可以在两个项目之间的边界处添加一层包装代码,用于捕捉一种类型的异常并重新抛出另一种类型的异常。
  3. 避免跨边界抛出异常:

    • 在设计时尽量避免跨项目抛出异常,而是通过函数返回值等方式来传达错误状态。
    • 比如,您可以定义一个错误码系统,通过返回值或者输出参数来传递错误信息,而不是抛出异常。
  4. 单元测试和集成测试:

    • 彻底地对您的代码进行单元测试和集成测试,确保在不同异常处理模型下的行为是一致的,并且能够正确处理错误情况。
  5. 文档说明:

    • 更新项目的文档,明确指出哪些模块使用了哪种异常处理模型,并给出如何安全地调用这些模块的指导。

综上所述,为了确保代码的稳定性和可维护性,最推荐的做法是尽可能在所有相关的项目中采用相同的异常处理模型。如果这不可行,那么就需要采取一些额外的措施来确保异常可以被正确处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3281789.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

SD写真实战,通用写真工作流InstantID分享

在人工智能图像生成领域,Stable Diffusion以其强大的图像生成能力而备受关注。而InstantID作为Stable Diffusion的通用写真工作流,更是将写真生成推向了一个新的高度。现在,让我们一起探索InstantID的工作流,一键生成你的专属写真…

基于RK3588J电力巡检机器人系统控制嵌入式AI主板

智慧巡检 信迈提供基于Intel平台、Rockchip平台、飞腾平台的核心板、3.5寸板、Mini-ITX主板、Micro-ATX主板以及嵌入式准系统等计算机硬件。产品小体积,低功耗设计,提供丰富串口、USB、LAN、Mini-PCIe扩展接口等I/O接口,具备优秀的扩展能力和…

英伟达开始引领下一波浪潮:物理AI

这可能会是AI技术形态的一个转折点,大模型的下一个形态,不再是人和模型一轮一轮的即时问答了。 当地时间 7 月 29 日,在美国丹佛举行的第 51 届 SIGGRAPH 计算机图形学会议上,英伟达创始人、CEO 黄仁勋与 Meta 创始人、CEO 马克・扎克伯格进…

Shell教程

Shell教程 0.参考链接1.什么是.sh文件2.编写规范3.编程语法3.1变量3.2运算符3.3控制语句3.4 shell脚本传参3.5 函数3.6 脚本调试3.7 pidof命令3.8killall相关命令 0.参考链接 [1].sh文件 [2]Linux–Shell基础 [3]SHELL脚本–expr命令全解 [4]pidof [5]linux killall 、kill 、…

开放式耳机原理是什么?通过不入耳的方式,享受健康听音体验

在开放式耳机的领域又细分了骨传导和气传导两种类型的耳机, 气传导开放式耳机原理 气传导是传统的声音传递方式,它依赖于空气作为声音传播的介质。 声源输入:与普通开放式耳机相同,音频设备通过耳机线将电信号传递到耳机。 驱动…

TCP 和 UDP 之间的区别?

从 连接,可靠性,传输方式等方面: TCP 是面向连接的协议,在发送数据的时候需要先通过 TCP 的三次握手,而 UDP 是无连接的协议,可以直接传输数据TCP 通过超时重传,流量控制和拥塞控制等方法保障了…

2023年中医药市场深度剖析:政策引领,创新驱动,迈向黄金发展期!

中医药作为中国传统文化的重要组成部分,在现代医学体系中占据着独特的地位。本文基于《药融咨询》发布的《中药行业现状与未来趋势白皮书》,深入分析了中医药行业的发展现状、政策环境、市场情况、研发进展及未来发展趋势,旨在为行业内外的读…

Pycharm打开 .xlsx文件 使用系统自带的软件

问题由来 最初默认是使用自带的软件打开 同事电脑默认打开方式是pycharm,有点不好弄,希望打开方式是默认系统默认; 自己尝试修改了一下自己的.xlsx打开方式,无法解决同事问题,后删除默认,自己电脑就出现乱码…

华杉研发九学习日记18 集合 泛型

华杉研发九学习日记18 一,集合框架 1.1 集合和数组的区别 集合就是在java中用来保存多个对象的容器 集合是数组的升级版,集合中只能放置对象[object]. 数组: 在java中用来保存多个具有相同数据类型数据的容器 数组弊端: 1.数组只能保存…

http代理和socks5代理哪个更适合你的网络需求?

在选择HTTP代理和SOCKS5代理时,哪个更适合你的网络需求主要取决于你的具体使用场景和需求。以下是对两者特点及应用场景的详细分析,以帮助你做出更合适的选择: HTTP代理 特点: 协议层级:http代理工作在应用层&#x…

WebLogic:弱口令,木马反弹连接

weblogic WebLogic 是 Oracle 公司开发的应用服务器,主要用作开发、集成、部署和管理大型分布式 Web 应用、网络应用和数据库应用的 Java 应用服务器。它在历史上曾出现过多个安全漏洞,其中包括弱口令、任意文件上传、SSRF、反序列化漏洞等 常见版本&a…

CentOS通过rsync实现文件同步(daemon方式)

rsync介绍 rsync是Liunx下的远程数据同步工具,可快速同步多台服务器间的文件和目录,并可实现增量同步以减少数据的传输。 rsync有两种常用的认证方式,一种是rsync-daemon方式,另外一种是ssh方式。 daemon 方式与 ssh 方式相比有…

Docker 搭建 Minio 容器

Docker 搭建 Minio 容器 (完整详细版) 简介: Minio 是一个基于Apache License v2.0开源协议的对象存储服务,虽然轻量,却拥有着不错的性能。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据。 例如图片、视频、日…

【获取Jmeter中正则获取的数据】

获取参数值保存在本地 Jmeter获取参数保存本地【三步走策略】【一】正则表达式提取器【二】BeanShell 后置处理程序【三】执行看结果 Jmeter获取参数保存本地【三步走策略】 节省人工成本之获取参数值保存本地 【一】正则表达式提取器 【二】BeanShell 后置处理程序 FileWri…

归并排序 python C C++ 图解 代码 及解析

一,概念及其介绍 归并排序(Merge sort)是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列&#xff…

下载安装docker并解决拉去镜像的connect:connection refused问题(2024.7.31亲测有效)

原文链接:使用国内链接安装最新docker 最近dockerhub已经不能访问了,使用原先的方式安装docker,服务器上也总是连接不上,所以找了种可以在国内正常安装新版docker的方式 适用系统:centos7 先删除本机旧的或者残留的…

书生大模型实战营闯关 - 8GB显存玩转书生大模型demo

创建开发机 创建一个使用10%GPU算力,cuda12.2系统的开发机,并启动。由于开发机的IO性能较差,开发机共享盘中已经创建好了本次实验所需要的conda环境 # 启动共享的conda环境 conda activate /root/share/pre_envs/icamp3_demo部署cli模型 创…

Python安装与环境配置,2024最新,超详细保姆级教程!

安装Python 来到Python官网:https://www.python.org/ Downloads>Windows: 选择想要的版本后点击进去: 下载后点击安装: 在本地电脑输入命令提示符:winR 环境变量配置 若执行命令提示符,输入Python后&…

网工必装软件,SecureCRT从零到精通,不可错过

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 中午好,我的网工朋友。 相信在平时的日常工作中,大家经常需要通过安全的方式远程访问各种设备和服务。SecureCRT作为一款强…