我试图在一个用shared_ptr 1.34 ( gcc 4.5.2的衍生产品)构建的嵌入式项目中使用xc32。该项目已禁用RTTI与-fno-rtti。
#include <memory>仅包括标题就会给出以下错误:
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory: In member function 'virtual void* std::tr1::_Ref_count_del<_Ty, _Dx>::_Get_deleter(const std::type_info&) const':
In file included from APP/MODULES/LIGHT_MANAGER/LightManager.cpp:13:0:
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory:1264:39: error: cannot use typeid with -fno-rtti
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory: In member function 'virtual void* std::tr1::_Ref_count_del_alloc<_Ty, _Dx, _Alloc>::_Get_deleter(const std::type_info&) const':
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory:1299:39: error: cannot use typeid with -fno-rtti
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory: In function '_Dx* std::tr1::get_deleter(const std::tr1::shared_ptr<_Ty2>&)':
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory:1956:44: error: cannot use typeid with -fno-rtti所以我想知道的是:如果没有RTTI,通常不可能使用shared_ptr,还是我做错了什么?
发布于 2016-07-04 11:22:00
问题是get_deleter空闲函数:
template D* get_deleter(const shared_ptr& p) T>; 返回:如果
p拥有类型为cv-不合格的D类型的删除器d,则返回std:addressof(d);否则返回nullptr。只要存在拥有shared_ptr的d实例,返回的指针就仍然有效。
显然,最直接的实现是将删除器的typeid存储在控制块中。虽然还有其他可能的实现,但它们将(a)更复杂,(b)与启用RTTI的代码失去二进制兼容性,(c)违背-fno-rtti的“精神”。
另一个有问题的函数是dynamic_pointer_cast,它在存储的指针上调用dynamic_cast。
然而,shared_ptr的主要功能可以在不使用RTTI功能的情况下实现,事实上,正如谢尔盖·尼可洛夫( Sergei )上面提到的,gcc 4.8.5附带的shared_ptr与-fno-rtti一起工作,但get_deleter和dynamic_pointer_cast函数除外;只要您不使用这些工具,就没有理由不能使用shared_ptr。这可以与例如any进行对比,如果不使用typeid,它是无法实现的。
供应商有责任提供一个标准库,该库适用于编译器的所有配置,包括支持使用的非标准配置。但是,如果您的供应商不合作,您仍然有以下几种选择:
get_deleter代码;https://stackoverflow.com/questions/38180899
复制相似问题