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