如果我有用C ++ 03编写的库并将其编译为静态库,那么我可以在C ++ 11中使用它吗?也是相反的可能(使用C ++ 03的C ++ 11静态库)。
更新: 我使用的编译器是clang或LLVM
如果我有用C ++ 03编写的库并将其编译为静态库,那么我可以在C ++ 11中使用它吗?也是相反的可能(使用C ++ 03的C ++ 11静态库)。
更新: 我使用的编译器是clang或LLVM
这主要取决于您如何在库中使用C ++标准库。
如果您根本不使用它,那么您不太可能遇到任何问题。
如果你使用 libstdc++
,那么你可能会遇到一些问题:
将标准库对象传入和传出库并不总是有效(例如, std::list
在C ++ 11模式下,它最终会比目前在C ++ 98模式下更大,因为它正在增长 size
数据成员,以及 std::string
正在改为非参考计数的一个)。 g ++开发人员计划引入一种符号污染形式,以便在链接时捕获这些问题,因此如果遇到任何有问题的情况,你会遇到错误,但是这还没有在g ++中实现,可能永远不会在铛。您可以通过确保库的接口不涉及标准库类型来避免此问题。
某些符号可能会改变含义(例如, std::complex::real
和 std::complex::imag
在C ++ 98模式下返回引用,但由于a,在C ++ 11模式下按值返回 constexpr
不足)。如果使用C ++ 98和C ++ 11表单链接(未优化)代码,则可能选择了错误的实现,在运行时会出现奇怪的结果。
如果你使用 libc++
,你不应该看到任何问题。 libc++
被设计为C ++ 98和C ++ 11模式之间的二进制兼容。
如果你使用 libc++
在图书馆和 libstdc++
在程序中,反之亦然,那么大多数不兼容性将在链接时被捕获。 (libc++
用一个 inline namespace
中 namespace std
包含大多数符号,如果您尝试传递,会导致链接时不兼容 libstdc++
跨越边界的类型。但是,如果您的库的界面可能仍然存在运行时问题 间接 包含标准库类型(例如,如果它使用 struct
它具有标准库类型作为成员)。对于那些类型 libc++
不版本,它的目标是二进制兼容 libstdc++
(在C ++ 98和C ++ 11模式下)。
取决于编译器。例如,GCC在C ++ 11模式下破坏了C ++ 11中ABI发生变化的标识符。所以,例如,如果你不使用诸如此类的东西 std::list
那你很好。