C++ 如何处理libstdc++;跨执行边界抛出异常

C++ 如何处理libstdc++;跨执行边界抛出异常,c++,exception,C++,Exception,根据,在libstdc++实现中,很多std::string函数都会抛出异常。我无法更改libstdc++的实现,切换到其他库的成本太高。我现在的目标是使我的代码大量使用STD::String,符合SEI Curt C++编码标准。我的问题是: 如何解决这个问题,使libstdc++不会跨越执行边界 我认为,无论我切换到哪种标准库实现,我最终都可能会遇到这个问题,因为从库中抛出异常是一件非常常见并且可以说是合理的事情。那么,这是否意味着我将永远面对这样的问题?它在实践中是如此微不足道,以至于人们

根据,在libstdc++实现中,很多std::string函数都会抛出异常。我无法更改libstdc++的实现,切换到其他库的成本太高。我现在的目标是使我的代码大量使用STD::String,符合SEI Curt C++编码标准。我的问题是:

  • 如何解决这个问题,使libstdc++不会跨越执行边界
  • 我认为,无论我切换到哪种标准库实现,我最终都可能会遇到这个问题,因为从库中抛出异常是一件非常常见并且可以说是合理的事情。那么,这是否意味着我将永远面对这样的问题?它在实践中是如此微不足道,以至于人们不太在意,还是人们使用异常来处理错误只是一种折衷

  • 谢谢

    > C++代码标准已经禁止你在执行边界上传递非标准布局类型,而<>代码:STD::String 就是这样的一种类型。例外部分不会使问题变得更糟

    通常选择的合理解决方案是在程序中没有“执行边界”。相反,您可以使用单个ABI和单个标准库编译整个程序


    如果你有一个插件机制,你通常会为插件接口创建一个狭窄的API。在这个界面上,你甚至可以粘贴到一个C abi,所以插件作者不局限于C++。因为这是一个C abi,所以你要确保C++异常不会被抛出到插件。代码> STD::String 在这里不是问题,您使用“代码> char const */COD> < < /P> > P> C++编码标准已经禁止您在执行边界上传递非标准布局类型,<代码> STD::String < /Cord>是这样的类型。例外部分不会使问题变得更糟

    通常选择的合理解决方案是在程序中没有“执行边界”。相反,您可以使用单个ABI和单个标准库编译整个程序


    如果你有一个插件机制,你通常会为插件接口创建一个狭窄的API。在这个界面上,你甚至可以粘贴到一个C abi,所以插件作者不局限于C++。因为这是一个C abi,所以你要确保C++异常不会被抛出到插件。代码> STD::String 在这里不是问题,您使用的是 char const */COD>。“执行边界”可能是上述编码标准的术语,但它不是C++中经常使用的一个术语。有两件事要记住:是的,在正常情况下,你不能逃避异常,同时还要写惯用语C++。然而,如果中止是可以接受的,那么您可以重建一个std库来执行该操作,而不是抛出。我似乎记得至少STLport曾经有过这样的选择。你所说的“执行边界”是什么意思?如果您指的是ABI边界,那么允许异常跨越ABI边界可能是未定义的行为(可能是实现定义的-检查您的工具链文档)。@RichardCriten:不,不是。有很多ABI支持异常,例如C++的IATIAI ABI。@ MsAlter然后例外不是跨越ABI边界。@ RICHARDCRITTEN:我不认为您的“ABI边界”比问题的“执行边界”更具信息性,那么,“执行边界”可能是上述编码标准的术语。但它不是在C++环境中经常使用的。有两件事要记住:是的,在正常情况下,你不能逃避异常,同时还要写惯用语C++。然而,如果中止是可以接受的,那么您可以重建一个std库来执行该操作,而不是抛出。我似乎记得至少STLport曾经有过这样的选择。你所说的“执行边界”是什么意思?如果您指的是ABI边界,那么允许异常跨越ABI边界可能是未定义的行为(可能是实现定义的-检查您的工具链文档)。@RichardCriten:不,不是。有很多ABI支持例外,例如C++的ItAudiaabi。@ MsAlter然后例外不是跨越ABI边界。@ RICHARDCRITTE:我不觉得你的“ABI边界”比问题的“执行边界”更具信息性,然后。谢谢你的回答。“您使用一个ABI和一个标准库编译整个程序。”请您详细说明一下如何做到这一点?假设我的程序形成一个ABI,而标准库形成另一个ABI,那么只要我在程序中使用这些std::string函数,异常就会跨越ABI边界,对吗?你的意思是我需要将标准库源代码与我的程序源代码一起编译吗?杰姆斯:按定义定义的标准库是C++实现的一部分,必须与编译器匹配。您不需要专门编译它,这已经为您完成了。为了完整起见,请注意,在Linux上,情况稍微复杂一些,因为常见的实现依赖于操作系统版本的C库。当然,这不会影响
    std::string
    或异常。谢谢@MSalters。我可能对标准图书馆的工作方式有一些误解。这是因为std::string的实现只有在包含后才会成为我的实现的一部分,正如您所说,编译器已经为我完成了。那些在libstdc++.so或libstdc++.a中预编译成二进制形式的函数呢?当与libstdc++链接时,如果这些函数中的任何一个抛出,是否会导致异常跨越ABI边界?e、 g.异常从libstdc++.so跨越到myprog.exe?@james:你似乎在与术语作斗争。在C++语言中,“实现”指的是预处理器、编译器、链接器和标准。