web-dev-qa-db-fra.com

Comment puis-je définir une fonction C dans un fichier, puis l'appeler à partir d'un autre?

Disons que je définis une fonction dans le fichier func1.c, et je veux l'appeler à partir du fichier call.c, comment pourrais-je accomplir cela? Merci d'avance!

29
Sam H

Vous mettriez une déclaration pour la fonction dans le fichier func1.h, et ajouter #include "func1.h" dans call.c. Ensuite, vous compileriez ou lieriez func1.c et call.c ensemble (les détails dépendent du système C).

30
David Thornley

Utilisez un Forward Declaration

Par exemple:

typedef struct
{
    int SomeMemberValue;
    char* SomeOtherMemberValue;
} SomeStruct;

int SomeReferencedFunction(int someValue, SomeStruct someStructValue);

int SomeFunction()
{
   SomeStruct s;
   s.SomeMemberValue = 12;
   s.SomeOtherMemberValue = "test string";

   return SomeReferencedFunction(5, s) > 12;
}

Il existe une fonctionnalité qui vous permet de réutiliser ces déclarations avancées appelées Fichiers d'en-tête . Prenez simplement les déclarations avancées, placez-les dans le fichier d'en-tête, puis utilisez #include pour les ajouter à chaque fichier source C dans lequel vous référencez les déclarations avancées.

/* SomeFunction.c */

#include "SomeReferencedFunction.h"

int SomeFunction()
{
   SomeStruct s;
   s.SomeMemberValue = 12;
   s.SomeOtherMemberValue = "test string";

   return SomeReferencedFunction(5, s) > 12;
}

/* SomeReferencedFunction.h */

typedef SomeStruct
{
    int SomeMemberValue;
    char* SomeOtherMemberValue;
} SomeStruct;

int SomeReferencedFunction(int someValue, SomeStruct someStructValue);

/* SomeReferencedFunction.c */

/* Need to include SomeReferencedFunction.h, so we have the definition for SomeStruct */
#include "SomeReferencedFunction.h"

int SomeReferencedFunction(int someValue, SomeStruct someStructValue)
{
    if(someStructValue.SomeOtherMemberValue == NULL)
        return 0;

    return someValue * 12 + someStructValue.SomeMemberValue;
}

Bien sûr, pour pouvoir compiler les deux fichiers source, et donc la bibliothèque entière ou le programme exécutable, vous devrez ajouter la sortie des deux fichiers .c à la ligne de commande du lieur, ou les inclure dans le même "projet" ( en fonction de votre IDE/compilateur).

Beaucoup de gens suggèrent de créer des fichiers d'en-tête pour toutes vos déclarations de transfert, même si vous ne pensez pas en avoir besoin. Lorsque vous (ou d'autres personnes) allez modifier votre code et changer la signature des fonctions, cela leur évitera de devoir modifier tous les endroits où la fonction est déclarée en amont. Cela peut également vous aider à éviter certains bogues subtils, ou au moins à confondre les erreurs du compilateur.

12