从库中的 std::exception 派生:headers-only 解决方案是否适用于捕获异常?
Deriving from std::exception in a library: Does a headers-only solution work for catching exceptions?
在我们的 cross-platform 开源库中,我们派生自 std::exception 以定义可以在 library-code 和 user-code 中捕获的自定义异常。我看到这实际上是一个推荐的过程,但是在 Visual Studio 2015(或者更确切地说,伴随的新 MSVC 版本?)中,在实现 class(warning C4275 ) - see also here: How to dllexport a class derived from std::runtime_error?
当然我们可以忽略这个错误,但这对我来说似乎是错误的。
与旧的 Visual Studio 版本相比,出现警告的原因似乎是 std::exception 曾经在旧的 MSVC 版本中导出,但同时不再导出。无论哪种情况,我都觉得永远不会 "the right way" 以将其编译到库中的形式继续下去。
根据我在答案中读到的内容,更好的方法是 "inline" class,因为导出基础 class (std::exception) 可能导致更多的并发症。如果我理解正确的话,这里的 "inlining" 意味着不使用 "inline" 关键字而是将定义移动到 header 并且不导出它。这甚至是正确的吗?
假设这是什么意思:我的问题是如果抛出异常的编译库(在其 header 之一中定义)将允许在链接它的可执行文件中正确捕获异常库动态。但是如果编译器不同怎么办?运行时类型信息 (RTTI) 似乎与此相关,那么即使使用不同的编译器版本甚至不同的编译器,这是否也能保证以上述方式工作?如果这样不行,如何用"right"方式解决?
引用问题 post 中的 Microsoft Connect issue (webarchive);
... putting STL types in your DLL's interface forces you to play by the STL's rules (specifically, you can't mix different major versions of VC, and your IDL settings must match). However, there is a workaround. C4251 is essentially noise and can be silenced...
混合使用编译器版本和选项可能(并且可能在某些时候)导致应用程序出现问题和不可预测的行为。所以,不能保证它会起作用,安静可能恰恰相反,它不会起作用。
当使用上面提到的内联技术(即仅 header 实现)并确保设置和编译器在项目中保持一致时,考虑到 dll 导出的约束,可以解决问题。
鉴于它是一个开源项目,它可以很容易地为客户环境构建,所以提到的任何技术都应该是合适的,因为客户将能够根据他们想要的编译器和选项构建代码.
在我们的 cross-platform 开源库中,我们派生自 std::exception 以定义可以在 library-code 和 user-code 中捕获的自定义异常。我看到这实际上是一个推荐的过程,但是在 Visual Studio 2015(或者更确切地说,伴随的新 MSVC 版本?)中,在实现 class(warning C4275 ) - see also here: How to dllexport a class derived from std::runtime_error?
当然我们可以忽略这个错误,但这对我来说似乎是错误的。
与旧的 Visual Studio 版本相比,出现警告的原因似乎是 std::exception 曾经在旧的 MSVC 版本中导出,但同时不再导出。无论哪种情况,我都觉得永远不会 "the right way" 以将其编译到库中的形式继续下去。
根据我在答案中读到的内容,更好的方法是 "inline" class,因为导出基础 class (std::exception) 可能导致更多的并发症。如果我理解正确的话,这里的 "inlining" 意味着不使用 "inline" 关键字而是将定义移动到 header 并且不导出它。这甚至是正确的吗?
假设这是什么意思:我的问题是如果抛出异常的编译库(在其 header 之一中定义)将允许在链接它的可执行文件中正确捕获异常库动态。但是如果编译器不同怎么办?运行时类型信息 (RTTI) 似乎与此相关,那么即使使用不同的编译器版本甚至不同的编译器,这是否也能保证以上述方式工作?如果这样不行,如何用"right"方式解决?
引用问题 post 中的 Microsoft Connect issue (webarchive);
... putting STL types in your DLL's interface forces you to play by the STL's rules (specifically, you can't mix different major versions of VC, and your IDL settings must match). However, there is a workaround. C4251 is essentially noise and can be silenced...
混合使用编译器版本和选项可能(并且可能在某些时候)导致应用程序出现问题和不可预测的行为。所以,不能保证它会起作用,安静可能恰恰相反,它不会起作用。
当使用上面提到的内联技术(即仅 header 实现)并确保设置和编译器在项目中保持一致时,考虑到 dll 导出的约束,可以解决问题。
鉴于它是一个开源项目,它可以很容易地为客户环境构建,所以提到的任何技术都应该是合适的,因为客户将能够根据他们想要的编译器和选项构建代码.