mikrocontroller.net

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


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
int main()
{
}
akzeptieren und daraus für sich selbst
int main()
{
  return 0;
}
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.
int main()
{
  return EXIT_SUCCESS;
}
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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peterle Anonym (Firma: keine) (wanderameise)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peterle Anonym (Firma: keine) (wanderameise)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Eure Beiträge !!!
Mfg Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.