gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:07:57 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

    • 某些符号可能会改变含义(例如,std::complex::realstd::complex::imag 在 C++ 中返回引用98 模式,但由于 constexpr 缺陷,在 C++11 模式下按值返回)。如果您同时使用 C++98 和 C++11 形式将(未优化的)代码链接在一起,您可能会选择错误的实现,并在运行时产生奇怪的结果。

  • 如果您使用 libc++,您应该看不到任何问题。 libc++ 旨在实现 C++98 和 C++11 模式之间的二进制兼容。

  • 如果您在库中使用 libc++ 并在程序中使用 libstdc++,反之亦然,那么大多数不兼容性将在链接时被发现。 (libc++ 在包含其大部分符号的 namespace std 中使用了 inline namespace,如果您尝试传递 libstdc++,则会导致链接时不兼容 的跨界类型)。但是,如果您的库的接口(interface)间接包含标准库类型(例如,如果它使用具有标准库类型作为成员的struct),您可能仍然会遇到运行时问题.对于 libc++ 没有版本的类型,它旨在与 libstdc++ 二进制兼容(在 C++98 和 C++11 模式下)。

关于带有 C++11 源代码的 C++03 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12637699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com