2009-03-18 7 views
1

J'ai du code C sur lequel je travaille, et on dirait que ça devrait marcher. Lorsque j'essaie de lier les fichiers objets, j'obtiens une erreur indiquant "référence non définie à outputBus" et ainsi de suite pour chacun d'entre eux dans la fonction getLine dans main. Je l'ai essayé avec et sans l'esperluette avant les noms des fonctions. compilation avec gcc -ansi. Qu'est-ce que je fais mal?Passer une fonction à une autre fonction en C. Que fais-je de mal?

typedef void(*DualOutput)(const int, const int); 
typedef void(*TripleOutput)(const int, const int, const double); 

void passenger(node**, node**, itemtype*); 
double bus(node**, node**, itemtype*); 
int getLine(itemtype*, DualOutput, DualOutput); 
void getLines(node**, node**, DualOutput, DualOutput, TripleOutput); 
void outputBus(const int, const int); 
void outputPeople(const int, const int); 
void outputTotal(const int, const int, const double); 

int main(int argc, char **argv){ 
    node *head = NULL; 
    node *tail = NULL; 

    getLines(&head, &tail, outputBus, outputPeople, outputTotal); 
    return 0; 
} 
+1

Il est bien que vous essayez d'aimer vos fichiers objet, mais vous aimeriez peut-être les relier. ;) – Svante

Répondre

9

Est-ce que ces fonctions ont des corps n'importe où dans votre code? Toutes ces lignes avant la fonction principale sont seulement la fonction déclarations (aka prototypes). Vous devez créer et implémenter la fonction quelque part. Une déclaration de fonction est une promesse au compilateur que la fonction existera quelque part plus tard dans le code (ou dans un autre fichier objet), donc elle ne se plaindra pas. Ensuite, le linker voit que vous avez rompu votre promesse et se fâche.

+1

+1 aime l'analogie de la promesse –

+1

+1 pour déranger l'éditeur de liens :) – qrdl

1

"Référence non définie" est une erreur de l'éditeur de liens qui signifie que l'éditeur de liens ne trouve pas l'implémentation de la méthode. Si elle est définie dans un fichier source distinct, compilez-vous et reliez-les ensemble? Si c'est dans une bibliothèque, reliez-vous à la bibliothèque (avec l'option -lfoo de gcc pour libfoo)?

1

Certains "est-il branché?" de type questions pour vous aider à démarrer:

  • Avez-vous fait les fonctions mettre en œuvre outputBus(), outputPeople() et outputTotal() partout?

  • Si oui, ce module était-il inclus dans le lien?

Comme indiqué, les fonctions de sortie sont déclarées mais non définies. Sans définition dans un fichier objet inclus dans le lien, il s'agit bien de références non définies. L'éditeur de liens essaie de vous dire que vous devez définir ces fonctions.

1

Vous avez déclaré des fonctions mais ne les implémentez nulle part. Ce juste déclare une fonction:

void outputBus(const int, const int); 
Questions connexes