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

C++ C++;03带C+的库+;11源代码,c++,c++11,clang,c++03,C++,C++11,Clang,C++03,如果我有一个用C++03编写的库,并且我将它编译成一个静态库,那么我可以在C++11中使用它吗?也可以使用相反的方法(使用C++03的C++11静态库) 更新: 我使用的编译器是clang或LLVM取决于编译器。例如,GCC会在C++11模式下以不同的方式对其ABI在C++11中更改的标识符进行损坏。因此,例如,如果你不使用诸如代码> STD::List之类的东西,那么你就可以了。 < P>这主要取决于你如何使用库中的C++标准库。 如果你根本不使用它,那么你就不可能遇到任何问题 如果使用li

如果我有一个用C++03编写的库,并且我将它编译成一个静态库,那么我可以在C++11中使用它吗?也可以使用相反的方法(使用C++03的C++11静态库)

更新:
我使用的编译器是clang或LLVM取决于编译器。例如,GCC会在C++11模式下以不同的方式对其ABI在C++11中更改的标识符进行损坏。因此,例如,如果你不使用诸如<>代码> STD::List之类的东西,那么你就可以了。

< P>这主要取决于你如何使用库中的C++标准库。
  • 如果你根本不使用它,那么你就不可能遇到任何问题

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

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

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

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

  • 如果在库中使用
    libc++
    ,在程序中使用
    libstdc++
    ,反之亦然,则大多数不兼容将在链接时捕获。(
    libc++
    namespace std
    中使用一个
    内联命名空间
    ,该命名空间包含它的大多数符号,如果您试图跨边界传递
    libstdc++
    的类型,则会导致链接时间不兼容)。但是,如果库的接口间接包含标准库类型(例如,如果它使用标准库类型作为成员的
    struct
    ),则可能仍然存在运行时问题。对于
    libc++
    没有版本的类型,它的目标是与
    libstdc++
    二进制兼容(在C++98和C++11模式下)


您的C++03编译器和标准库二进制文件是否与您的C++11编译器和标准库兼容?@hvd-注意;我已经删除了我以前的评论。谢谢。你提到了你现在使用的编译器,但没有提到标准库。clang至少可以与GCC的libstdc++一起使用,我不知道是否还有其他的。我认为使用libc++更有意义。在这种情况下,我知道可能导致libstdc++出现问题的一些不兼容不适用,但是我不确定是否还有其他问题。ABI兼容性问题不能完全通过将它们排除在接口之外来避免。它们可以出现的另一个地方是界面中出现的其他类型是否在内部存储了ABI不兼容的标准库对象。我希望“不涉及标准库类型”可以涵盖这种情况,但如果您认为不清楚,我将编辑答案。