Réponse rapide: changement int testlib()
de int testlib(void)
pour indiquer que la fonction ne prend pas d'arguments.
Un prototype est, par définition, une déclaration de fonction qui spécifie le type(s) de la fonction de l'argument(s).
Un non-prototype déclaration de fonction comme
int foo();
est un vieux de la déclaration de style qui ne précise pas le nombre ou le type des arguments. (Avant 1989 en C ANSI standard, c'était le seul genre de déclaration de la fonction dans la langue.) Vous pouvez appeler cette fonction avec un nombre quelconque d'arguments, et le compilateur n'a pas à se plaindre, mais si l'appel est incompatible avec la définition, votre programme a un comportement indéfini.
Pour une fonction qui prend un ou plusieurs arguments, vous pouvez spécifier le type de chaque argument dans la déclaration:
int bar(int x, double y);
Fonctions sans arguments sont un cas particulier. Logiquement, les parenthèses vides aurait été un bon moyen de spécifier qu'un argument mais que la syntaxe était déjà en usage pour les vieux style déclarations de fonction, de sorte que le C ANSI comité a inventé une nouvelle syntaxe à l'aide de l' void
mot-clé:
int foo(void); /* foo takes no arguments */
Une fonction de définition (qui inclut le code pour que la fonction ne) fournit également une déclaration. Dans votre cas, vous avez quelque chose de similaire à:
int testlib()
{
/* code that implements testlib */
}
Cela fournit un non-prototype de déclaration de l' testlib
. Comme une définition, elle indique au compilateur qu' testlib
n'a pas de paramètres, mais comme une déclaration, il ne indique au compilateur qu' testlib
prend un peu quelconque, mais fixe le nombre et le type(s) d'arguments.
Si vous modifiez ()
de (void)
la déclaration devient un prototype.
L'avantage d'un prototype, c'est que si par inadvertance, vous appelez testlib
avec un ou plusieurs arguments, le compilateur devra en diagnostiquer l'erreur.
C++ a des règles légèrement différentes. C++ n'a pas de style ancien déclarations de fonction, et des parenthèses vides spécifiquement à dire qu'une fonction ne prend pas d'arguments. C++ prend en charge l' (void)
de la syntaxe pour des raisons de cohérence avec C. Mais à moins que vous avez spécifiquement besoin de votre code à compiler à la fois comme le C et le C++, vous devriez probablement utiliser l' ()
en C++ et l' (void)
de syntaxe dans C.)