2013-04-09 6 views
10

Hier ist der Code (gültig C und C++)Gibt es eine Garantie für die automatische Ausspülung vor dem Verlassen? Wie funktioniert es?

#include <stdio.h> 

int main() { 
    printf("asfd"); 
    // LINE 1 
    return 0; 
} 

Wenn in Zeile 1 I Ausdruck put Speicherzugriffsfehler würde das Programm ohne nur abstürzen etwas Druck (wie erwartet).

Aber warum ist der oben genannte Code "asdf" Drucken und nicht ohne Puffer entleert werden? Was ist unter der Haube und warum funktioniert es wie erwartet?

+0

Verwenden Sie printf nicht in C++ !! –

+1

Hinweis: Diese Frage ist zweifach getaggt, aber die Antwort ist in C anders als in C++. Raymond Chens Antwort deckt C++ ab. @JensGustedts Antwort deckt C ab (wurde aber gelöscht ...) –

Antwort

17

Dies wird durch diese beiden Abschnitte in der C++ Sprachspezifikation erreicht:

[basic.start.main]

Eine return-Anweisung in main die Wirkung hat, verlassen die Hauptfunktion und Aufruf 10 mit dem Rückgabewert als Argument.

und

[lib.support.start.term]

Die Funktion exit hat zusätzliches Verhalten in dieser Internationalen Norm:

  • ...
  • Als nächstes werden alle offenen C-Ströme mit ungeschriebenen gepufferten Daten ar Es wurde rot.
  • ...
+0

Interessant, wenn es möglich ist, Prozeduren zu erweitern, die 'exit' durchführt oder sogar überlädt. Ich sollte versuchen –

+4

@sasha.sochka: Sie können die 'Exit'-Funktion nicht überladen; Wenn Sie es versuchen, wird Ihre Funktion nicht aufgerufen. Sie können jedoch Funktionen registrieren, die beim Beenden mit der Funktion ['atexit (3)'] (http://linux.die.net/man/3/atexit) aufgerufen werden. –

+0

Die Frage fragt "Was ist unter der Haube?" Ich interpretiere dies als fragen, wie das Verhalten umgesetzt wird. Diese Antwort zitiert lediglich den Standard, der besagt, dass es umgesetzt werden muss. –

1

Wenn main() beendet wird, werden alle offenen Datenströme geschlossen ... einschließlich stdout. Das Schließen des offenen Streams löscht stdout, und was Sie in den Puffer geschrieben haben, wird mit oder ohne Zeilenumbruch festgelegt.

2

eine Rückkehr von main Im Allgemeinen ist nicht das Ende des Programms, noch ist Eintritt zu main der Anfang.

Normalerweise markiert der Linker, der die endgültige ausführbare Datei für Ihr Programm erstellt, einen Speicherort, vielleicht mit dem Namen start, als den Ort, an dem die Ausführung beginnen soll. Wenn das Betriebssystem Ihr Programm lädt und es startet, startet es die Ausführung an dieser Stelle. Dort gibt es einen Code, der eine Umgebung aufbaut: Erzeugt einen Stack, setzt Stream-Zustände und so weiter. Dann ruft dieser Code main.

Wenn main zurückkehrt, kehrt es zu diesem speziellen Code zurück. Dieser Code führt dann verschiedene Bereinigungsarbeiten aus, die am Ende eines C- oder C++ - Programms erforderlich sind, wie in this answer beschrieben.

Wenn ein Programm abrupt beendet wird, wird dieser letzte Code möglicherweise nicht ausgeführt.

Verwandte Themen