[英]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::real
和std::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.