Schnelle Antwort: Wechseln Sie int testlib()
zu, int testlib(void)
um anzugeben, dass die Funktion keine Argumente akzeptiert.
Ein Prototyp ist per Definition eine Funktionsdeklaration, die den Typ (die Typen) der Argumente der Funktion angibt.
Eine Nicht-Prototyp-Funktionsdeklaration wie
int foo();
ist eine Deklaration im alten Stil, die weder die Anzahl noch die Art der Argumente angibt. (Vor dem ANSI C-Standard von 1989 war dies die einzige in der Sprache verfügbare Funktionsdeklaration.) Sie können eine solche Funktion mit einer beliebigen Anzahl von Argumenten aufrufen, und der Compiler muss sich nicht beschweren - aber wenn die Aufruf ist nicht mit der Definition vereinbar , Ihr Programm hat undefiniertes Verhalten.
Für eine Funktion, die ein oder mehrere Argumente akzeptiert, können Sie den Typ jedes Arguments in der Deklaration angeben:
int bar(int x, double y);
Funktionen ohne Argumente sind ein Sonderfall. Logischerweise wären leere Klammern eine gute Möglichkeit gewesen, um anzugeben, dass ein Argument, aber diese Syntax bereits für Funktionsdeklarationen alten Stils verwendet wurde. Daher hat das ANSI C-Komitee eine neue Syntax mit dem void
Schlüsselwort erfunden :
int foo(void); /* foo takes no arguments */
Eine Funktionsdefinition (der Code enthält , was die Funktion macht tatsächlich) liefert auch eine Erklärung . In Ihrem Fall haben Sie etwas Ähnliches wie:
int testlib()
{
/* code that implements testlib */
}
Dies bietet eine Nicht-Prototyp-Deklaration für testlib
. Als Definition teilt dies dem Compiler mit, testlib
der keine Parameter hat, aber als Deklaration teilt er nur dem Compiler mit, testlib
der eine nicht spezifizierte, aber feste Anzahl und Art von Argumenten akzeptiert.
Wenn Sie ()
zur (void)
Deklaration wechseln , wird ein Prototyp.
Der Vorteil eines Prototyps besteht darin, dass testlib
der Compiler den Fehler diagnostiziert , wenn Sie versehentlich mit einem oder mehreren Argumenten aufrufen .
(C ++ hat leicht abweichende Regeln. C ++ hat keine Funktionsdeklarationen im alten Stil, und leere Klammern bedeuten speziell, dass eine Funktion keine Argumente akzeptiert. C ++ unterstützt die (void)
Syntax für die Konsistenz mit C. Es sei denn, Sie benötigen Ihren Code speziell, um beide als zu kompilieren C und als C ++ sollten Sie wahrscheinlich die ()
in C ++ und die (void)
Syntax in C verwenden.)