Question

J'ai une bibliothèque que j'ai créée,

malib.c :

#include <mylib.h>
int
testlib() {
    printf("Hello world\n");
    return (0);
}

malib.h :

#include <stdio.h>
extern int testlib();

Dans mon programme, j'ai essayé d'appeler cette fonction de bibliothèque :

monprogramme.c :

#include <mylib.h>

int
main (int argc, char *argv[]) {
    testlib();
    return (0);
}

Lorsque j'essaye de compiler ce programme, j'obtiens l'erreur suivante :

In file included from myprogram.c:1
mylib.h:2 warning: function declaration isn't a prototype

J'utilise: gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2)

Ma question est la suivante : quelle est la bonne façon de déclarer un prototype de fonction ?

Était-ce utile?

La solution

En C int foo() et int foo(void) sont des fonctions différentes. int foo() accepte un nombre arbitraire d'arguments, tandis que int foo(void) accepte 0 argument.En C++, ils signifient la même chose.Je vous suggère d'utiliser void systématiquement quand vous voulez dire aucun argument.

Si vous avez une variable a, extern int a; est un moyen de dire au compilateur que a est un symbole qui peut être présent dans une unité de traduction différente (le compilateur C parle pour fichier source), ne le résolvez pas avant le moment de la liaison.D'un autre côté, les symboles qui sont des noms de fonctions sont de toute façon résolus au moment de la liaison.La signification d'un spécificateur de classe de stockage sur une fonction (extern, static) n'affecte que sa visibilité et extern est la valeur par défaut, donc extern est en fait inutile.

Je suggère de supprimer le extern, il est étranger et est généralement omis.

Autres conseils

Réponse rapide:changement int testlib() à 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 ni le nombre ni le type 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 le 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 arguments constituent 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ée 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 fonction définition (qui inclut le code pour ce que fait réellement la fonction) fournit également un 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 que testlib n'a pas de paramètres, mais en tant que déclaration, il indique uniquement au compilateur que testlib prend un nombre et un(des) type(s) d'arguments non spécifiés mais fixes.

Si tu changes () à (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 fonctions à l'ancienne, et les parenthèses vides signifient spécifiquement qu'une fonction ne prend aucun argument.C++ prend en charge le (void) syntaxe pour la cohérence avec C.Mais à moins que vous ayez spécifiquement besoin que votre code soit compilé à la fois en C et en C++, vous devriez probablement utiliser le () en C++ et le (void) syntaxe en C.)

Essayer:

extern int testlib(void);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top