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