2010-04-24 2 views
5

In Bezug auf die Behandlungsroutine beenden,Wo wird abort() und terminate() "live"?

wie ich es verstehe, wenn etwas Schlimmes im Code passiert zum Beispiel, wenn wir eine Ausnahme nicht fangen,

beenden() aufgerufen wird, die wiederum Anrufe abbrechen()

set_terminate (my_function) ermöglicht es uns, terminate() zu erhalten, um eine benutzerdefinierte Funktion my_terminate aufzurufen.

meine Frage ist: Wo diese Funktionen "leben" scheinen sie nicht ein Teil der Sprache zu sein, sondern arbeiten, als ob sie in jeder einzelnen cpp-Datei vorhanden sind, ohne eine Header-Datei enthalten zu müssen.

+0

Sie haben Header für die Funktion enthalten, die _you_ nennen. Daher gilt Ihre Anweisung "ohne eine Header-Datei enthalten zu müssen" nicht für 'set_terminate()'. – MSalters

Antwort

5

Wenn Standardhandlerfunktionen für terminate und abort vorhanden sind, die Sie nicht selbst installiert haben, müssen sie sich in der Laufzeitbibliothek befinden, die von Ihrem Compiler bereitgestellt wird.

Normalerweise ist jedes Programm mit der Laufzeitbibliothek verbunden (z. B. glibc unter Linux). Dies liegt unter anderem daran, dass die Laufzeitbibliothek "versteckten" Code für wesentliche Dinge enthält, z. Code, der Ihre main Funktion beim Start aufruft.

+1

Dank stakx, das Vorhandensein einer Laufzeitbibliothek erklärt die Dinge. – aCuria

3

Ich verstehe nicht, warum Sie denken, es nicht notwendig ist, einen Header enthalten:

int main() { 
    abort(); 
} 

gibt den folgenden Fehler für mich:

error: 'abort' was not declared in this scope 

Weder C noch C++ jede „special haben "Funktionen - wenn Sie eine Funktion verwenden möchten, müssen Sie es irgendwie deklarieren. Diese zwei leben in der C++ - Standardbibliothek und sind in cstdlib und exception deklariert. Natürlich können diese Header selbst von anderen Headern eingeschlossen sein, wodurch die Funktionen verfügbar gemacht werden, aber dies ist nicht durch den Standard spezifiziert.

+2

@Neil: Ich denke, er bezieht sich auf die Tatsache, dass die standardmäßige unerwartete Funktion ruft terminate(), aber der Benutzer ist nicht erforderlich, # eine Kopfzeile zu enthalten, die terminate() enthält, damit dies funktioniert. –

2

set_terminate - beenden Handler-Funktion

Sets f als die Handler-Funktion beenden.

Eine Terminate-Handler-Funktion ist eine Funktion, die automatisch aufgerufen wird, wenn der Ausnahmebehandlungsprozess aus irgendeinem Grund abgebrochen werden muss. Dies ist der Fall, wenn ein Handler für eine ausgelöste Ausnahme oder für einen anderen außergewöhnlichen Umstand nicht gefunden werden kann, der die Weiterverarbeitung unmöglich macht.

Der beenden Handler standardmäßig Anrufe cstdlib's abort Funktion