Wozu return 0; im Programm ?

Persönliche Seite #580731
Lesenswert?

Ist dein main() ist als int main(... ausgelegt, d.h. als Funktion, die 
einen int-Wert zurück gibt? Meckert (warnt) dein C-Compiler nicht, wenn 
die Funktion keinen Wert zurück gibt?

Bei µC Anwendungen ist meist nicht vorgesehen, dass diese return 
Anweisung tatsächlich ausgeführt wird. Wohin soll das Programm auch 
zurückkehren - wer/was ist das aufrufende Programm?

Daher spielt es auch keine Rolle welcher Wert dort steht return 0 oder 
return 42... return 0 kann aber in eine besonders kurze ASM-Instruktion 
übersetzt werden. Bei nicht µC Anwendungen benutzt man meist 0 für "kein 
Fehler" und andere Werte für einen Fehlercode.
#580773
Lesenswert?

Die kurze Antwort ist: Weil es im C Standard für sog.
'hosted Environments' so vorgesehen ist.
Ein hosted Environment ist salopp gesagt: Dein Programm
läuft unter Kontrolle eines Betriebssystems.

Für µC ergibt sich da ein Sonderfall: Eigntlich gibt es
da meist kein Betriebssystem, welches deine main() aufruft
und daher würde ein Returnwert keinen Sinn ergeben. Allerdings
ist es ja nicht so dass die komplette Programmausführung beim
main() startet. Auch wenn kein Betriebssystem vorhanden ist,
so läuft doch vor dem main() zunächst mal die Initialisierungs-
sequenz der C-Runtime ab, die verschiedene buchhalterische
Dinge ins Laufen bringt und danach dein main() aufruft. Falls
main() je zurückkommt, dann erwartet diese Initialisierungssequenz
einen Returnwert, auch wenn sie nichts damit anfangen kann.
D.h. mit einem Returntyp von int für main() bist du immer
auf der sicheren Seite, es sei denn deine Compilerdoku sagt
was anderes.

Weiters gibt es für main() eine spezielle Regel in C.
Der Compiler ist verpflichtet, wenn kein expliziter 'return'
in main() vorkommt, sich selbst einen hinzuzudenken. D.h.
der Compiler muss
1
int main()
2
{
3
}
akzeptieren und daraus für sich selbst
1
int main()
2
{
3
  return 0;
4
}
machen.

Im C-Standard sind auch einige Konstanten definiert, die als
Returnwert für main() immer zulässig sind. Diese sind:
0, EXIT_SUCCESS, EXIT_FAILURE. 0 und EXIT_SUCCESS sind
gleichwertig.
1
int main()
2
{
3
  return EXIT_SUCCESS;
4
}
ist also identisch zu den beiden obigen Code-Schnipseln.
Darüber hinaus kann eine Implementierung natürlich noch andere
Konstanten definieren, die dem Aufrufer (in der Regel das Betriebs-
system) bestimmte Dinge signalisieren können. Meist wird der
Returnwert aber einfach nur in der Betriebssystem-Shell (der
Kommandozeile) in irgend einer Form zugänglich gemacht, damit
dieser in Batch Dateien oder sontigen Skriptsprachen ausgewertet
und weiterverarbeitet werden kann.

Wie gesagt: Auf einem µC ist das nicht besonders relevant, da
in der Regel kein Betriebssystem vorhanden ist, welches mit
dem Returnwert etwas anfangen kann. Trotzdem ist es guter Stil
sich einfach daran zu gewöhnen, dass main() einen int zurückliefert.
Durch die main-return Sonderregelung ist das ja auch nicht mit
einem besonderen Mehraufwand verbunden.
#580920
Lesenswert?

In der Regel besteht das Main aufm MC aus einer Endlosschleife.


Ein "return xx;" dahinter ist daher toter Code und wird nicht 
implementiert bzw. kann gleich weggelassen werden.


Es ist sogar sinnvoll, es wegzulassen.
Dann wird man nämlich angemeckert, sobald man die Mainloop vergißt.


Peter
#580933
Lesenswert?

Benjamin Moll wrote:
> und was wenn ich void main(void) schreibe?dürfte doch auch gehn oder?

Dann bewegst du dich ausserhalb des C-Standards (es sei denn
deine Compilerdoku sagt explizit dass du das darfst).

Aber warum willst du das machen?
'int' ist doch um einen Buchstaben kürzer als 'void'. D.h.
du hast noch nicht mal mehr Tippaufwand.
Gast #581031
Lesenswert?

> es würde aber die diskussion über return 0 überflüssig machen ;)

Wenn die Leute es einfach akzeptieren würden, wäre auch jegliche 
Diskussion überflüssig. Stattdessen sagen sie sich "das brauche ich 
nicht", lassen es weg und meckern dann in irgendwelchen Foren darüber, 
daß der Compiler eine Warnung ausspuckt.
Beitrag #5653269 wurde von einem Moderator gelöscht.
Beitrag #5653270 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren