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