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

时间:2012-09-28 09:53:45

标签: c++ c++11 clang c++03

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

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

2 个答案:

答案 0 :(得分:15)

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

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

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

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

    • 某些符号可能会改变含义(例如,std::complex::realstd::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之类的内容,那么您就可以了。

相关问题