C++ C++;03带C+的库+;11源代码
如果我有一个用C++03编写的库,并且我将它编译成一个静态库,那么我可以在C++11中使用它吗?也可以使用相反的方法(使用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
我使用的编译器是clang或LLVM取决于编译器。例如,GCC会在C++11模式下以不同的方式对其ABI在C++11中更改的标识符进行损坏。因此,例如,如果你不使用诸如<>代码> STD::List之类的东西,那么你就可以了。 < P>这主要取决于你如何使用库中的C++标准库。
- 如果你根本不使用它,那么你就不可能遇到任何问题
- 如果使用
,则可能会遇到一些问题:libstdc++
- 向库传递标准库对象和从库传递标准库对象并不总是有效(例如,在C++11模式下,
最终将比当前在C++98模式下更大,因为它正在增加一个std::list
数据成员,并且大小
的表示形式正在更改为非引用计数的表示形式). g++开发人员计划引入一种符号污染形式,以便在链接时捕获这些问题,因此,如果遇到任何有问题的情况,都会出现错误,但这在g++中尚未实现,可能永远不会在Clang中实现。通过确保库的接口不涉及标准库类型,可以避免此问题std::string
- 某些符号可能会改变含义(例如,
和std::complex::real
在C++98模式下返回引用,但由于std::complex::imag
缺陷,在C++11模式下按值返回)。如果同时使用C++98和C++11表单链接(未优化)代码,则可能选择了错误的实现,并在运行时产生奇怪的结果constepr
- 向库传递标准库对象和从库传递标准库对象并不总是有效(例如,在C++11模式下,
- 如果您使用的是
,您应该不会看到任何问题libc++
被设计为在C++98和C++11模式之间实现二进制兼容libc++
- 如果在库中使用
,在程序中使用libc++
,反之亦然,则大多数不兼容将在链接时捕获。(libstdc++
在libc++
中使用一个namespace std
,该命名空间包含它的大多数符号,如果您试图跨边界传递内联命名空间
的类型,则会导致链接时间不兼容)。但是,如果库的接口间接包含标准库类型(例如,如果它使用标准库类型作为成员的libstdc++
),则可能仍然存在运行时问题。对于struct
没有版本的类型,它的目标是与libc++
二进制兼容(在C++98和C++11模式下)libstdc++