C++ 如何处理libstdc++;跨执行边界抛出异常
根据,在libstdc++实现中,很多std::string函数都会抛出异常。我无法更改libstdc++的实现,切换到其他库的成本太高。我现在的目标是使我的代码大量使用STD::String,符合SEI Curt C++编码标准。我的问题是:C++ 如何处理libstdc++;跨执行边界抛出异常,c++,exception,C++,Exception,根据,在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 在这里不是问题,您使用的是
std::string
或异常。谢谢@MSalters。我可能对标准图书馆的工作方式有一些误解。这是因为std::string的实现只有在包含后才会成为我的实现的一部分,正如您所说,编译器已经为我完成了。那些在libstdc++.so或libstdc++.a中预编译成二进制形式的函数呢?当与libstdc++链接时,如果这些函数中的任何一个抛出,是否会导致异常跨越ABI边界?e、 g.异常从libstdc++.so跨越到myprog.exe?@james:你似乎在与术语作斗争。在C++语言中,“实现”指的是预处理器、编译器、链接器和标准。