如果我有C 03编写的库,并将其编译到静态库中,那么可以在C 11中使用它吗?也是相反的(C 11静态库与C 03).
更新:
我使用的编译器是clang或LLVM
解决方法
它主要取决于您如何在库中使用C标准库.
>如果你根本不使用它,那么你不太可能会遇到任何问题.
>如果使用libstdc,可能会遇到一些问题:
>将标准库对象传递到库或从库传递标准库对象将不会始终工作(例如,C 11模式中的std :: list最终会比C 98模式中的更大,因为它正在增加大小数据成员,而std :: string的表示正在更改为非引用计数). g开发人员有计划在链接时引入一种符号污点的形式来捕捉这些问题,所以如果遇到任何有问题的案例,您将收到错误,但是这还没有在g中实现,并且可能永远不会实现铛.您可以通过确保库的界面不涉及标准库类型来避免此问题.
>某些符号可能会改变意义(例如,std :: complex :: real和std :: complex :: imag在C 98模式下的返回引用,但是由于constexpr的缺陷,在C 11模式下返回值).如果使用C 98和C 11表单链接(未优化)代码,则可能会选择错误的实现,并在运行时产生奇怪的结果.
>如果你使用libc,你不应该看到任何问题. libc被设计为在C 98和C 11模式之间是二进制兼容的.>如果您在程序中使用库中的libc和libstdc,反之亦然,则大多数不兼容性将在链接时被捕获. (libc使用命名空间std中的内联命名空间,其中包含大部分符号,如果您尝试跨越边界传递libstdc的类型,则会导致链接时间不兼容).但是,如果库的接口间接包含标准库类型(例如,如果使用具有标准库类型的结构作为成员),则可能仍然存在运行时问题.对于libc不是版本的类型,它的目标是与libstdc(C 98和C 11模式)二进制兼容.