繁体   English   中英

带有C ++ 11源代码的C ++ 03库

[英]C++03 library with C++11 source code

如果我有用C ++ 03编写的库并将其编译为静态库,那么我可以在C ++ 11中使用它吗? 也是相反的可能(使用C ++ 03的C ++ 11静态库)。

更新:我使用的编译器是clang或LLVM

这主要取决于您如何在库中使用C ++标准库。

  • 如果您根本不使用它,那么您不太可能遇到任何问题。

  • 如果您使用libstdc++ ,那么您可能会遇到一些问题:

    • 将标准库对象传入和传出库并不总是有效(例如,C ++ 11模式下的std::list最终会比目前在C ++ 98模式下更大,因为它正在增长一个size数据成员,并且std::string的表示形式正在变为非引用计数的表示。 g ++开发人员计划引入一种符号污染形式,以便在链接时捕获这些问题,因此如果遇到任何有问题的情况,你会遇到错误,但是这还没有在g ++中实现,可能永远不会在铛。 您可以通过确保库的接口不涉及标准库类型来避免此问题。

    • 一些符号可能会改变含义(例如, std::complex::realstd::complex::imag在C ++ 98模式下返回引用,但由于constexpr缺陷而在C ++ 11模式下按值返回) 。 如果使用C ++ 98和C ++ 11表单链接在一起(未优化)代码,则可能选择了错误的实现,在运行时会出现奇怪的结果。

  • 如果您使用libc++ ,则不应该看到任何问题。 libc++被设计为C ++ 98和C ++ 11模式之间的二进制兼容。

  • 如果在库中使用libc++ ,在libc++中使用libstdc++ ,反之亦然,那么大多数不兼容性将在链接时捕获。 libc++namespace std包含其大部分符号的inline namespace namespace std ,如果您尝试跨越边界传递libstdc++的类型,则会导致链接时不兼容)。 然而,你可能仍然有运行时的问题,如果你的库的接口间接包含标准库类型(例如,如果它使用一个struct具有标准库类型的成员)。 对于libc++没有版本的类型,它的目标是与libstdc++二进制兼容(在C ++ 98和C ++ 11模式下)。

取决于编译器。 例如,GCC在C ++ 11模式下破坏了C ++ 11中ABI发生变化的标识符。 所以,例如,如果你不使用std::list东西,那你就没事了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM