int func();
ist eine veraltete Funktionsdeklaration aus der Zeit, als es noch keinen C-Standard gab, d. h. aus der Zeit von K&R C (vor 1989, dem Jahr, in dem die erste "ANSI C"-Norm veröffentlicht wurde).
Denken Sie daran, dass es keine Prototypen in K&R C und das Schlüsselwort void
war noch nicht erfunden. Alles, was man tun konnte, war, dem Compiler die Rückgabetyp einer Funktion. Die leere Parameterliste in K&R C bedeutet "eine nicht spezifizierte, aber feste" Anzahl von Argumenten. Fest bedeutet, dass Sie die Funktion mit der Option dieselbe Anzahl von Argumenten jedes Mal (im Gegensatz zu einer variadisch Funktion wie printf
wobei die Anzahl und Art der Anrufe variieren kann).
Viele Compiler diagnostizieren dieses Konstrukt; insbesondere gcc -Wstrict-prototypes
wird Ihnen sagen: "Funktionsdeklaration ist kein Prototyp", was genau richtig ist, weil es siehe wie ein Prototyp (besonders wenn man von C++ vergiftet ist!), ist es aber nicht. Es handelt sich um eine K&R C-Rückgabewert-Deklaration im alten Stil.
Faustformel: Lassen Sie niemals eine leere Parameterlistendeklaration leer, verwenden Sie int func(void)
um genau zu sein. Dadurch wird die K&R-Rückgabedeklaration zu einem richtigen C89-Prototyp. Die Compiler sind glücklich, die Entwickler sind glücklich, die statischen Prüfer sind glücklich. Diejenigen, die von^W^Wfond of C++ in die Irre geführt werden, könnten allerdings zusammenzucken, weil sie zusätzliche Zeichen eingeben müssen, wenn sie versuchen, ihre Fremdsprachenkenntnisse anzuwenden :-)