mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik "Korrektes" C


Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil mir es mal wieder auffiel und ich mich selber schon in die Nesseln 
gesetzt habe, hier mal eine allgemeingültige Frage.

Es geht um die Main-Funktion und ihre Parameter bzw Rückgaben:
int main(void) {
  ...
  return 0;
}

"int" darf man ja scheinbar nach C-Standard weglassen. Es wird hier 
immer "int" impliziert.

Was ist mit dem "return". Ich habe es gerade nicht ausprobiert. Einigen 
Compilern stört es nicht, wenn man es weglässt. Wenn ich aber "int" vor 
dem main angebe, müsste korrekterweise doch ein "return" angegeben sein.

Ich habe einen Rüffel (keine Warnung oder Fehlermeldung) bekommen, als 
ich einmal das "int" durch ein "void" ersetzt und kein "return" 
verwendet habe.
Das war für mich bei einem µC in Ordnung, da es weder Aufrufparameter 
noch Rückgaben gibt. Da dieses Konstrukt mir auch nicht von Compiler um 
die Ohren gehauen wurde, dachte ich, es sein auch korrekt.

Wie sieht es mit den Parametern des "main" aus? Was ist hier als 
korrektes C erlaubt? Beliebige oder nur bestimmte?

Ich war bisher der Meinung, dass man das "void" auch komplett weglassen 
könnte, da eine leere Parameterliste nichts anderes bedeutet. Der 
Compiler
was dort anderer Meinung. Also schreibe ich jetzt auch immer brav "void" 
hinein.

Sind auch andere Rückgaben als "int" bzw "unsigned int" erlaubt?

Ich selber habe bisher nur mit gcc gearbeitet und habe mich auch nicht
so intensiv mit den C-Standards auseinander gesetzt. Wie gesagt, alles 
was der Compiler nicht anmeckerte, war für mich korrektes C.


Auch auf die Gefahr hin, das hier wieder meckert:
Solange mein Programm sauber läuft und mein Compiler keine Warnungen 
und Fehler ausgibt, ist es mir egal.

Wenn es aber um Kompatibilität mit anderen Compilern geht, sollte man 
sich ja schon an den Standard halten, welchen alle verstehen (sollten).

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
main ist ein Spezialfall, bei dem auch bei Angabe eines Rückgabewertes 
das abschließende Return weggelassen werden darf.

Was sich die Leute, die das so standardisiert haben, dabei gedacht haben 
mögen, entzieht sich meiner Kenntnis.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian H. schrieb:

> "int" darf man ja scheinbar nach C-Standard weglassen. Es wird hier
> immer "int" impliziert.

Ja, könnte aber Warnungen provozieren. Schlechter K&R-Stil.

> Was ist mit dem "return". Ich habe es gerade nicht ausprobiert. Einigen
> Compilern stört es nicht, wenn man es weglässt.

Darf man bei main() und nur dort.

> Ich war bisher der Meinung, dass man das "void" auch komplett weglassen
> könnte, da eine leere Parameterliste nichts anderes bedeutet.

Das gilt für C++. In C ist eine leere Liste eine unbekannte 
Parametrisierung. Uraltes K&R-C, vor ANSI-C. Läuft bei der 
Funktionsdefinition auf's Gleiche raus, führt aber dazu, dass in 
Aufrufen die Parameter nicht kontrolliert/konvertiert werden. Bei main 
daher egal, sonst nicht.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach ISO-C99:

Christian H. schrieb:
> "int" darf man ja scheinbar nach C-Standard weglassen. Es wird hier
> immer "int" impliziert.
Nicht mehr; C99 fordert eine explizite Typenangabe, auch bei Variablen.
Früher wurde implizit ein 'int' angenommen, das ist richtig.

> Was ist mit dem "return". Ich habe es gerade nicht ausprobiert. Einigen
> Compilern stört es nicht, wenn man es weglässt. Wenn ich aber "int" vor
> dem main angebe, müsste korrekterweise doch ein "return" angegeben sein.
C99 verlangt für die main()-Funktion einen Rückgabewert vom Typ 'int'. 
Es ist aber erlaubt, die return-Anweisung auszusparen. In diesem Fall 
entspricht das 'exit(0)', es wird also 0 angenommen.

> Ich habe einen Rüffel (keine Warnung oder Fehlermeldung) bekommen, als
> ich einmal das "int" durch ein "void" ersetzt und kein "return"
> verwendet habe.
S.o. Der Standard schlägt die folgenden beiden Varianten der 
main()-Funktion vor:
- int main(void);
- int main(int argc, char *argv[]);
Andere Varianten dürfen von einer speziellen Implementierung unterstützt 
werden, das ist aber selten.

> Das war für mich bei einem µC in Ordnung, da es weder Aufrufparameter
> noch Rückgaben gibt. Da dieses Konstrukt mir auch nicht von Compiler um
> die Ohren gehauen wurde, dachte ich, es sein auch korrekt.
Naja, µC ist vermutlich eine spezielle Implementierung. Wie gesagt, der 
C99-Standard schlägt die obigen beiden Varianten vor, lässt aber Raum 
für Anderes.

> Wie sieht es mit den Parametern des "main" aus? Was ist hier als
> korrektes C erlaubt? Beliebige oder nur bestimmte?
S.o.

> Ich war bisher der Meinung, dass man das "void" auch komplett weglassen
> könnte, da eine leere Parameterliste nichts anderes bedeutet. Der
> Compiler
> was dort anderer Meinung. Also schreibe ich jetzt auch immer brav "void"
> hinein.
Jein, wenn du void hineinschreibst, ist die Liste leer, d.h., wenn du 
beim Aufruf trotzdem Argumente einsetzt, ist das ein Fehler.
Lässt du die Klammern aber leer, ist das alter K&R-Stil; du darfst an 
Argumenten einsetzen, was du möchtest, es gibt aber dann z.B. keine 
Typenprüfung.

> Sind auch andere Rückgaben als "int" bzw "unsigned int" erlaubt?
S.o.

> Ich selber habe bisher nur mit gcc gearbeitet und habe mich auch nicht
> so intensiv mit den C-Standards auseinander gesetzt. Wie gesagt, alles
> was der Compiler nicht anmeckerte, war für mich korrektes C.
Dem GCC musst du beibringen, C99 zu benutzen:
gcc --std=c99 -pedantic -Wall -Wextra


> Auch auf die Gefahr hin, das hier wieder meckert:
> Solange mein Programm sauber läuft und mein Compiler keine Warnungen
> und Fehler ausgibt, ist es mir egal.
>
> Wenn es aber um Kompatibilität mit anderen Compilern geht, sollte man
> sich ja schon an den Standard halten, welchen alle verstehen (sollten).
Vollkommen richtig. Wobei es ja nur Formalismen sind, tut nicht weh, sie 
zu befolgen :-)

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.