我想用自己的方法覆盖纯虚拟调用(__cxa_pure_virtual()
)的标准处理程序。 Windows的答案是' _set_purecall_handler()'。
Linux / GNU中是否有类似的工具?
答案 0 :(得分:4)
你是如此接近自己回答这个问题。这是gcc/libstdc++-v3/libsupc++/pure.cc
中__cxa_pure_virtual
的来源:
extern "C" void
__cxxabiv1::__cxa_pure_virtual (void)
{
writestr ("pure virtual method called\n");
std::terminate ();
}
因此,与GCC的微软_set_purecall_handler
没有直接对等关系。但是,由于此函数调用std::terminate
,因此您可以使用std::set_terminate
设置在打印消息后调用的处理程序。
另一种可能的解决方案是提供自己的__cxxabiv1::__cxa_pure_virtual
定义,以覆盖库函数。像这样:
namespace __cxxabiv1 {
extern "C" void
__cxa_pure_virtual(void) {
char const msg[] = "my pure virutal\n";
write(2, msg, sizeof msg - 1);
std::terminate();
}
}
答案 1 :(得分:0)
在所有g ++(4.5测试版)中没有启用任何额外警告将告诉您正在从构造函数/析构函数调用抽象函数,这应该无需设置自定义处理程序。
由于有效的C ++程序永远不会产生纯虚拟调用,我假设您在Windows上设置了此处理程序以用于诊断/调试目的。在这种情况下,在编译时而不是运行时诊断似乎要容易得多。