Réponse rapide: remplacez int testlib()
par int testlib(void)
pour spécifier que la fonction ne prend aucun argument.
Un prototype est par définition une déclaration de fonction qui spécifie le (s) type (s) du ou des arguments de la fonction.
Une déclaration de fonction non-prototype comme
int foo();
est une déclaration à l'ancienne qui ne spécifie pas le nombre ou les types d'arguments. (Avant la norme ANSI C de 1989, c'était le seul type de déclaration de fonction disponible dans le langage.) Vous pouvez appeler une telle fonction avec n'importe quel nombre arbitraire d'arguments, et le compilateur n'est pas obligé de se plaindre - mais si le 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);
Les fonctions sans argument sont un cas particulier. Logiquement, des parenthèses vides auraient été un bon moyen de spécifier qu'un argument mais cette syntaxe était déjà utilisé pour les déclarations de fonctions à l'ancienne, le comité ANSI C a donc inventé une nouvelle syntaxe en utilisant le void
mot - clé:
int foo(void); /* foo takes no arguments */
Une définition de fonction (qui comprend le code de ce que fait réellement la fonction) fournit également une déclaration . Dans votre cas, vous avez quelque chose de similaire à:
int testlib()
{
/* code that implements testlib */
}
Cela fournit une déclaration non-prototype pour testlib
. En tant que définition, cela indique au compilateur qui testlib
n'a pas de paramètres, mais en tant que déclaration, il indique uniquement au compilateur qui testlib
prend un certain nombre et type (s) d'arguments non spécifiés mais fixes.
Si vous passez ()
à (void)
la déclaration devient un prototype.
L'avantage d'un prototype est que si vous appelez accidentellement testlib
avec un ou plusieurs arguments, le compilateur diagnostiquera l'erreur.
(C ++ a des règles légèrement différentes. C ++ n'a pas de déclarations de fonction à l'ancienne, et les parenthèses vides signifient spécifiquement qu'une fonction ne prend aucun argument. C ++ prend en charge la (void)
syntaxe pour la cohérence avec C. Mais à moins que vous n'ayez spécifiquement besoin de votre code pour compiler les deux comme C et en C ++, vous devriez probablement utiliser le ()
en C ++ et la (void)
syntaxe en C.)