Der Code wird kompiliert, weil dies vom C-Standard gefordert wird (mindestens vor 1999). Die Unterstützung wurde im Standard 1999 weggelassen, obwohl eine Reihe von Compilern dies seither unterstützen - obwohl sie in solchen Fällen so konfiguriert werden können, dass sie warnen (z. B. über eine implizite Deklaration).
Aus Gründen der Rückwärtskompatibilität von C89/90 zu C vor dem Standard deklariert ein Versuch von Code zum Aufrufen einer Funktion implizit diese Funktion als int
zurückgeben und eine Liste mit variablen Argumenten akzeptieren.
Dies ist, was passiert, wenn der Compiler durch A. C arbeitet
Bei der Verknüpfung, wird es funktionieren, da die Funktion den gleichen Namen hat.
Dies funktioniert in der Praxis, wenn die Art, wie die Funktion aufgerufen wird (die Verwendung des Rückgabewerts und die Anzahl der Argumenttypen), mit der Definition der Funktion übereinstimmt. Wenn es keine Übereinstimmung gibt, ist das Ergebnis möglicherweise nicht definiertes Verhalten. Wenn die Funktion beispielsweise mit 4 Argumenten definiert ist und alle 4 verwendet, der Aufrufer jedoch 3, ist das Verhalten nicht definiert. Wenn die Funktion so definiert ist, dass sie double
zurückgibt, nimmt der Aufrufer jedoch an, dass sie int
zurückgibt.
In der Regel sollten Sie alle Funktionen in allen Übersetzungseinheiten deklarieren, bevor sie aufgerufen werden (zB durch Einfügen eines Headers). Dies ermöglicht dem Compiler eine gewisse Überprüfung, ob die Art, wie eine Funktion aufgerufen wird, mit ihrer Deklaration übereinstimmt.
Beachten Sie auch, dass in allen C-Standards main()
int
, nicht void
zurückgibt. Die Unterstützung von main()
, die void
zurückgibt, ist eine Compiler-Erweiterung.
sind diese verbunden? –
Haben Sie eine Warnung gesehen? Wenn ich 'gcc' auf Ihrem Code verwende, sehe ich eine Warnung für eine" implizite Deklaration von 'test'". – lurker
Kaufen Sie ein C-Tutorium Buch. Dann wirst du verstehen warum. Schalten Sie die Warnungen nicht aus –