Я хотел переопределить стандартный обработчик для чистого виртуального вызова (__cxa_pure_virtual()
) с моим собственным. Ответ для Windows - "_set_purecall_handler()".
Есть ли аналогичное средство в Linux/GNU?
Вы подошли так близко, чтобы ответить на этот вопрос самостоятельно. Это источник __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 ();
}
Таким образом, нет прямого эквивалента Microsoft _set_purecall_handler
с GCC. Тем не менее, поскольку std::terminate
вызывается этой функцией, вы можете использовать std::set_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 для целей диагностики/отладки. В этом случае гораздо проще диагностировать во время компиляции, а не во время выполнения.
__cxa_pure_virtual()
Всякий раз, когда __cxa_pure_virtual()
).
std::set_terminate()
является (достаточно близким) ответом!