在Linux中是否有等效的_set _purecall handler()?

时间:2014-08-26 16:11:32

标签: c++ c linux gcc gnu

我想用自己的方法覆盖纯虚拟调用(__cxa_pure_virtual())的标准处理程序。 Windows的答案是' _set_purecall_handler()'。

Linux / GNU中是否有类似的工具?

2 个答案:

答案 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上设置了此处理程序以用于诊断/调试目的。在这种情况下,在编译时而不是运行时诊断似乎要容易得多。