在GCC中使用-std=c++17编译时恢复std::auto_ptr的方法
GCC 7/8 C++17下兼容std::auto_ptr的精准方案
好问题!针对你遇到的第三方库依赖std::auto_ptr,但又不想用-fpermissive(这个选项确实会放任很多不规范代码,风险太高)的情况,GCC的libstdc++提供了一个非常精准的宏来解决这个问题:
核心方案:_GLIBCXX_USE_AUTO_PTR宏
GCC的标准库实现(libstdc++)保留了专门的宏_GLIBCXX_USE_AUTO_PTR,用来在C17及更高标准模式下重新启用std::auto_ptr的定义。这个方案完全是针对性的,不会像-fpermissive那样放开其他不符合C标准的行为。
你有两种方式使用它:
- 编译选项全局定义:在编译命令中添加
-D_GLIBCXX_USE_AUTO_PTR,比如:g++ -std=c++17 -D_GLIBCXX_USE_AUTO_PTR your_code.cpp third_party_lib.cpp - 代码局部定义:在包含第三方库的头文件之前定义这个宏,确保第三方库编译时能看到它:
#define _GLIBCXX_USE_AUTO_PTR #include "third_party_lib.h"
注意事项
- 这个宏仅适用于GCC的libstdc++,如果你用Clang搭配libc++的话,需要用你已经找到的Clang专属方案,两者不冲突。
- 务必保证这个宏在所有引用第三方库的代码路径中都被定义,全局编译选项的方式最不容易出错。
- 虽然这个方案能解决当前的兼容问题,但从长期维护角度,还是建议推动第三方库迁移到
std::unique_ptr——毕竟std::auto_ptr在C11就被废弃,C17正式移除,后续GCC版本可能会逐步淘汰这个兼容宏。
内容的提问来源于stack exchange,提问作者Violet Giraffe
相关产品推荐
相关产品推荐

