Forum: Compiler & IDEs Wozu return 0; im Programm ?


von Peter (Gast)


Lesenswert?

Moin !
Wozu soll ich return 0; am Ende meines Programms mit hineinnehmen?
Was bewirkt dieses ?

Wäre nett, wenn mir jemand dies mal kurz erläutern würde!
Ich programmiere in C / C++ ...

Mfg Peter

von Stefan B. (stefan) Benutzerseite


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.

von Karl H. (kbuchegg)


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.

von Peter D. (peda)


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

von Peterle A. (Firma: keine) (wanderameise)


Lesenswert?

und was wenn ich void main(void) schreibe?dürfte doch auch gehn oder?

von Karl H. (kbuchegg)


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.

von Peterle A. (Firma: keine) (wanderameise)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

Es gibt keine Diskussion darüber :-)
Im C-Standard ist es so niedergeschrieben und der gilt.
Auch wenn Microsoft das jahrzehntelang in seinen Demoprogrammen
anders gemacht hat.

von Rolf Magnus (Gast)


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.

von Peter (Gast)


Lesenswert?

Danke für Eure Beiträge !!!
Mfg Peter

Beitrag #5653269 wurde von einem Moderator gelöscht.
Beitrag #5653270 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.