在c++中支持c++11语言,没有' -std=c++11 '的库破坏特性

C++11 language support in g++ without the library-breaking features of `-std=c++11`

本文关键字:c++11 -std 语言 没有 c++ 支持      更新时间:2023-10-16

是否有一种方法可以告诉g++启用c++ 11的新语言特性,而不会因ABI修改而对标准c++库进行任何破坏性更改?

添加-std=c++11编译标志告诉g++启用语言和库特性,但是以这种方式创建的目标文件不能安全地与使用不同-std=设置的目标文件链接。我希望能够使用语言增强,如右值引用,移动构造函数(为我自己的类),以及auto关键字在代码中链接到c++ 03库。

编辑:

我对g++启用其c++ 11 语言特性很感兴趣,但我希望它能够解析、编译和链接旧的c++ 03库。我不希望它使用c++ 11版本的标准库。这意味着在我自己的代码中,我将能够使用auto、range foreach结构、右值引用等,但我将无法使用标准c++库中的新c++ 11特性,如std::move或对STL容器的右值引用增强。不需要c++ 11版本的标准库的原因是各种对象的布局已经改变,因此将两个期望不同版本的标准库的对象文件链接到同一个二进制文件中是无效的。

不,如果没有c++ 11库特性,你就不能启用c++ 11语言特性(除非编辑libstdc++头文件以删除所有的c++ 11部分)

但是没有很多不兼容的符号(只要你不使用4.7.0或4.7.1有不兼容的std::list,在4.7.2中恢复),所以你可能只需要担心rb树容器的erase()成员。您可以确保在主可执行文件中定义了该符号的c++ 11版本,以便所有需要它的代码都可以使用该符号的版本。其他库中期望使用c++ 03版本的代码将忽略返回值,期望使用c++ 11版本的代码将能够使用返回值。

据我所知,GCC 4.7及以上版本有ABI修改。

使用-std=gnu++11代替-std=c++11可能也有帮助。我不知道为什么会这样,但它对我很有效。