2010-04-24 130 views
5

关于终止处理程序,abort()和terminate()在哪里?

据我了解,当坏事发生在代码中,例如,当我们不捕捉异常,

终止()被调用,这反过来又调用abort()

set_terminate(my_function)允许我们获取terminate()来调用用户指定的函数my_terminate。

我的问题是:这些函数在哪里“活”,它们似乎不是该语言的一部分,而是像在每个cpp文件中一样工作,而不必包含任何头文件。

+0

你必须包括该_you_调用函数头部的终止处理程序。因此,你的语句“不必包含任何头文件”不适用于'set_terminate()'。 – MSalters 2010-04-26 12:41:42

回答

5

如果您没有自己安装terminateabort的默认处理函数,它们必须位于编译器提供的运行时库中。

通常,每个程序都与运行时库链接(例如,Linux下的glibc)。除此之外,这是因为运行时库包含用于基本事物的“隐藏”代码,例如,在启动时调用main函数的代码。

+1

感谢stakx,运行时库的存在解释了一些事情。 – aCuria 2010-04-24 17:45:25

3

我不明白为什么你认为有没有必要包括头:

int main() { 
    abort(); 
} 

提供了以下错误对我来说:

error: 'abort' was not declared in this scope 

无论Ç也不C++有什么“特殊“函数 - 如果你想使用一个函数,你必须以某种方式声明它。这两个存在于C++标准库中,并在cstdlibexception中声明。当然,这些头文件本身可能被其他头文件包含,从而使这些函数可用,但这并不是标准规定的。

+2

@Neil:我认为他指的是这个事实,即默认的意外函数调用terminate(),但用户不需要#include包含terminate()的头文件以使其工作。 – 2010-04-24 17:39:01

2

set_terminate - 终止处理函数

集F作为终止处理函数。

终止处理程序函数是在出于某种原因必须放弃异常处理过程时自动调用的函数。发生抛出的异常时无法找到处理程序,或出现其他异常情况,导致无法继续处理过程时,会发生这种情况。

默认调用cstdlib's abort功能