Forum: Mikrocontroller und Digitale Elektronik "Korrektes" C


von Christian H. (netzwanze) Benutzerseite


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:
1
int main(void) {
2
  ...
3
  return 0;
4
}

"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).

von Rufus Τ. F. (rufus) Benutzerseite


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.

von (prx) A. K. (prx)


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.

von Sven P. (Gast)


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:
1
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 :-)

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.