29 votes

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

Si je définis une fonction dans le fichier func1.c et je veux l'appeler à partir du fichier call.c . Comment puis-je accomplir cette tâche ?

30voto

David Thornley Points 39051

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

12voto

Merlyn Morgan-Graham Points 31815

Utilisez un Déclaration prospective

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 prospectives, appelée Fichiers d'en-tête . Il suffit de prendre les déclarations en avant, de les placer dans le fichier d'en-tête, puis d'utiliser #include pour les ajouter à chaque fichier source C dans lequel vous faites référence aux déclarations forward.

/* 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 entendu, pour pouvoir compiler les deux fichiers sources, et donc la bibliothèque ou le programme exécutable dans son ensemble, vous devrez ajouter la sortie des deux fichiers .c à la ligne de commande de l'éditeur de liens, ou les inclure dans le même "projet" (selon votre IDE/compilateur).

De nombreuses personnes suggèrent de créer des fichiers d'en-tête pour toutes vos déclarations de forward, même si vous ne pensez pas en avoir besoin. Lorsque vous (ou d'autres personnes) modifierez votre code et changerez la signature des fonctions, vous gagnerez du temps en n'ayant pas à modifier tous les endroits où la fonction est déclarée à l'avance. Cela peut également vous éviter des bogues subtils, ou du moins des erreurs de compilation déroutantes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X