原文:https://docs.microsoft.com/zh-cn/cpp/c-runtime-library/reference/purecall?view=vs-2019
一、_purecall
默认纯虚拟函数调用错误处理程序。 当调用纯虚拟成员函数时,编译器生成调用此函数的代码。
语法
C复制
extern "C" int __cdecl _purecall();
备注
_purecall函数是 Microsoft C++编译器的特定于 Microsoft 的实现详细信息。 此函数不可以直接通过代码调用,也没有任何公用标头声明。 之所以在这里讨论此函数,是因为它是 C 运行时库的公用导出。
对纯虚拟函数的调用出错,因为它没有实现。 调用纯虚拟函数时,编译器将生成代码以调用 _purecall错误处理程序函数。 默认情况下 ,_purecall终止程序。 在终止之前,如果已为进程设置了 _purecall_handler函数,则_purecall函数将调用该函数。 可以安装自己的错误处理程序进行纯虚拟函数调用,以捕获这些调用用于调试和报告目的。 要使用自己的错误处理程序,请创建具有 _purecall_handler签名的函数,然后使用_set_purecall_handler使其成为当前处理程序。
默认情况下,此函数的全局状态范围为应用程序。 要更改此情况,请参阅CRT 中的全局状态。
要求
_purecall函数没有标头声明。 _purecall_handler类型def在 stdlib.h>中<定义。
二、_get_purecall_handler、 _set_purecall_handler
获取或设置纯虚函数调用的错误处理程序。
语法
C++复制
typedef void (__cdecl* _purecall_handler)(void);
_purecall_handler __cdecl _get_purecall_handler(void);
_purecall_handler __cdecl _set_purecall_handler(
_purecall_handler function
);
参数
函数
要在调用纯虚函数时调用的函数。 _Purecall_handler函数必须具有 void 返回类型。
返回值
上一个 _purecall_handler。 如果没有上一个处理程序,则返回nullptr 。
备注
_Get_purecall_handler和 _Set_purecall_handler函数是 Microsoft 特定的,仅适用于C++代码。
对纯虚拟函数的调用出错,因为它没有实现。 默认情况下,在调用纯虚函数时,编译器将生成代码来调用错误处理程序函数,这将终止该程序。 可以安装自己的错误处理程序进行纯虚拟函数调用,以捕获这些调用用于调试和报告目的。 若要使用自己的错误处理程序,请创建具有 _purecall_handler签名的函数,然后使用 _set_purecall_handler使其成为当前处理程序。
由于每个进程只有一个 _purecall_handler ,因此当调用 _set_purecall_handler时,它会立即影响所有线程。 任一线程上的最后一个调用方将设置该处理程序。
若要还原默认行为,请使用nullptr参数调用 _set_purecall_handler 。
要求
例程所返回的值 | 必需的标头 |
---|---|
_get_purecall_handler、 _set_purecall_handler | <cstdlib> 或 <stdlib.h> |
有关兼容性信息,请参阅 兼容性。
示例
C++复制
// _set_purecall_handler.cpp
// compile with: /W1
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
class CDerived;
class CBase
{
public:
CBase(CDerived *derived): m_pDerived(derived) {};
~CBase();
virtual void function(void) = 0;
CDerived * m_pDerived;
};
class CDerived : public CBase
{
public:
CDerived() : CBase(this) {}; // C4355
virtual void function(void) {};
};
CBase::~CBase()
{
m_pDerived -> function();
}
void myPurecallHandler(void)
{
printf("In _purecall_handler.");
exit(0);
}
int _tmain(int argc, _TCHAR* argv[])
{
_set_purecall_handler(myPurecallHandler);
CDerived myDerived;
}
Output复制
In _purecall_handler.