从库中的std :: exception派生:仅头文件解决方案是否适用于捕获异常?

Ide*_*ent 6 c++ dll std

在我们的跨平台开源库中,我们从std :: exception派生,以便定义可以在库代码和用户代码中捕获的自定义异常.我看到这实际上是一个推荐的过程,但在Visual Studio 2015中(或者更确切地说,随附的新MSVC版本?)在实现类中抛出警告(警告C4275) - 另请参见此处:如何从一个派生类的dllexport的std :: runtime_error?

当然我们可以忽略错误,但这对我来说似乎不对.

与较旧的Visual Studio版本相比,出现警告的原因似乎是std :: exception曾经在较旧的MSVC版本中导出,但同时不再导出.在任何一种情况下,我觉得从未以"正确的方式"继续以将其编译到库中的形式.

从我在答案中读到的,更好的方法是"内联"类,因为导出基类(std :: exception)可能会导致更多的复杂化.如果我理解正确,这里的"内联"意味着不使用"内联"关键字,而是将定义移到标题中而不导出它.这是否正确?

假设这就是我的意思:我的问题是,如果编译的库抛出异常(在其中一个标题中定义)将允许在动态链接此库的可执行文件中正确捕获异常.但是如果编译器不同呢?运行时类型信息(RTTI)在这里似乎是相关的,所以即使使用不同的编译器版本甚至不同的编译器,这也保证以这种方式工作?如果这不起作用,如何以"正确"的方式解决这个问题?

Nia*_*all 7

引用问题中链接的帖子中的Microsoft Connect问题(webarchive);

...将STL类型放入DLL的界面会强制您按照STL的规则进行播放(具体来说,您不能混用不同的主要VC版本,并且您的IDL设置必须匹配).但是,有一种解决方法.C4251基本上是噪音,可以沉默......

混合编译器版本和选项可能(并且可能在某些时候)导致应用程序出现问题和不可预测的行为.所以,没有保证它会起作用,安静可能相反,它将无法工作.

当使用上面提到的内联技术(即仅标题实现)并确保设置和编译器在项目中是一致的时,允许在给定dll导出的约束的情况下进行解决.

鉴于它是一个开源项目,它可以很容易地为客户端环境构建,因此所提到的任何技术都应该是合适的,因为客户端将能够根据他们想要的编译器和选项构建代码.