在c++中支持c++11语言,没有' -std=c++11 '的库破坏特性
C++11 language support in g++ without the library-breaking features of `-std=c++11`
是否有一种方法可以告诉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
可能也有帮助。我不知道为什么会这样,但它对我很有效。
- 为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
- 为什么 c++11 std::normal_distribution 在从函数调用时返回相同的模式?
- C++11 std::regex后备选项
- 有什么理由C++ 11+ std::mutex 应该声明为全局变量,而不是作为函数参数传递到 std::thread 中
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 如何在不接触函数本身的情况下暂停和恢复 C++11 std::thread 的功能
- C++11 std::列出拼接后的迭代器失效
- 我应该如何正确地播种C++11 std::d efault_random_engine
- How does c++11 std::ref work?
- 这是 clang c++11 std::regex_match 的功能还是错误?
- C 11 std :: This_thread :: Sleep_until()用GCC 4.8.5编译时挂起
- 如何使用C 11 STD ::线程实现类似Qthread的类
- 将 boost::thread 与 C++11 std::mutex 混合使用是否安全?
- C++11:std::locale::empty() 甚至是一个东西
- C++11 std::unique_ptr deleter
- C 11 std ::在不同的STL实现中使用哪些算法
- 如何使用C++11 std::thread设置堆叠大小
- 如果向量是特定的长度,则使用C++11 std::enable_if来启用成员函数
- 如何制作一个c++11 std::unordereded_set的std::weak_ptr
- C++ Visual C++ 2013 中的 11 std::enable_if 重载