main-Funktion ohne jeglichen Rückgabetyp?
-
Hallo,
ich hab in einem Tutorial (http://www.rzbt.haw-hamburg.de/dankert/c_tutor.html/) ein Programmtext mit einer Main-Funktion ohne Rückgabetyp gesehen. Ich war mir eigentlich sicher, dass es nicht funktioniert, aber es hat funktioniert. (Manche mögen jetzt an void denken, aber das war nicht mit angegeben~)
Hier der Code:#include <stdio.h> main() { printf( "Hallo Welt!\n" ); return 0; }
Wieso funiktioniert das und wieso bekomme ich von meinem Compiler (g++) nicht einmal eine Warnung oder ähnliches?
Danke
Squall
-
In alten C Varianten vor C99 (also C89 und K&R C) wurde immer implizit int angenommen wenn man den Typen weggelassen hat.
Also sieht der Compiler da ein
main()
und denkt sich "woha, da fehlt was, also nehm ich mal ein int rein" und sieht:
int main()
und ist gluecklich.
-
Ah, das dachte ich mir auch beinahe. Zu komisch, g++ gibt eine Warnung raus, wenn man "new line at end of file" vergessen hat, aber bei keinem Rückgabetyp von main wird nicht herumgemeckert.
Vielen Dank, nun kann ich mir ja sicher sein.
Squall
-
Squall schrieb:
Zu komisch, g++ gibt eine Warnung raus, wenn man "new line at end of file"
macht manch anderer compiler auch so (z.b. IAR). mich würde echt mal interessieren, was an einem fehlenden newline so schlimm ist.
-
Laut Standard muss eine Datei mit Newline beendet werden. Ueber Sinn und Zweck laesst sich streiten.
Der Grundgedanke ist:
foo.h:
#include "foo2.h"ohne newline
und dann in foo.c:
#include "foo.h"
#include "bar.h"was nach dem include ersetzen zu einem
void foo() {
}#include "bar.h"
werden wuerde.Aber idR sind die Praeprozessoren schon schlau genug so einen Quarks nicht zu machen. Aber das ist eben der Grund warum der Standard ein Newline verlangt. (uU gibt es noch mehrere Gruende die mir nicht bekannt sind)
-
^^sowas ähnliches hab' ich ja auch erst vermutet, aber meistens #included man doch keine .c-files. seltsam, seltsam das alles.
-
#include-freak schrieb:
^^sowas ähnliches hab' ich ja auch erst vermutet, aber meistens #included man doch keine .c-files. seltsam, seltsam das alles.
Ok, dumme Sache dass ich void foo(){} als Beispiel genommen habe.
Stell dir einvoid foo();
an der stelle vor