2011-04-20 106 views
5

假设我在C++中编写了一个DLL,并想导出一个采用std :: vector参数的方法。我希望在不同的STL版本之间有任何二进制兼容性吗?STL容器的二进制兼容性

+5

您甚至不希望在具有不同编译器标志的STL版本中使用二进制兼容性。 – 2011-04-20 21:02:06

回答

3

如果您的意思是包含在同一个编译器的更新版本中的版本,是的,它可以(并且将会)在某些情况下工作,但是您必须小心。还有一些特殊情况,例如Windows上的英特尔和微软编译器 - 英特尔非常谨慎地维护二进制兼容性,至少在我尝试过时,它总是很好地工作。

对于大多数其他情况,答案是否定的。

6

我不知道版本之间兼容性的任何保证,即使在同一个编译器上的版本和调试之间也没有。

一个解决方案是为矢量创建包装。创建一个包含容器中所需的所有功能的类,并根据对该类的唯一成员私有向量的操作来实现它们。将所有类代码保存在DLL中。

+0

+1 - 但这并不意味着它将是便携式的。诸如异常处理方案之类的东西可能会在编译器版本或编译器开关之间发生变化,并且您无法控制这些内容。通常,如果你想要二进制兼容性,那么你需要使用一个C接口。 (例如,在MSVC++中,'/ SAFESEH'和'/ Eh'开关会改变二进制级别的异常模型,我相信至少也是'/ GS') – 2011-04-20 20:47:33

4

绝对不是!如果使用相同编译器的不同版本进行编译,您甚至不能依赖相同版本的STL兼容。