2010-04-24 25 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功能