在Linux中是否存在_set_purecall_handler()的等效项?

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

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

你是如此接近自己回答这个问题。 这是gcc/libstdc++-v3/libsupc++/pure.cc__cxa_pure_virtual的来源__cxa_pure_virtual gcc/libstdc++-v3/libsupc++/pure.cc

 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(); } } 

在没有任何额外警告的情况下,所有g ++(已测试4.5)都会告诉您,您正在从构造函数/析构函数调用抽象函数,这应该无需设置自定义处理程序。

由于有效的C ++程序永远不会产生纯虚拟调用,我假设您在Windows上设置了此处理程序以用于诊断/调试目的。 在这种情况下,在编译时而不是运行时诊断似乎要容易得多。