2011-05-14 4 views
1

J'ai un programme composé de 3 fichiers:Appel d'une fonction à partir du même fichier d'en-tête à partir de deux fichiers C++ dans le même projet

main.c; other.c et event.h

événement.h a une fonction appelée 'événement()'.

Je voudrais appeler la fonction event() à partir de main.c et other.c. Au sommet des deux main.c et other.c-je inclure la ligne

#include "event.h" 

... et dans chacun des fichiers .c je les lignes

event(); 

Cependant je reçois ce qui suit des erreurs de compilation (Visual C++)

"de LNK1169 d'erreur fatale: un ou plusieurs symboles définis multiplication trouvé"

"erreur LNK2005: _event @ 16 déjà défini dans main.obj"

... Qu'est-ce que je fais mal?

Répondre

1

La définition de la fonction, c'est-à-dire son code, ne peut être donnée qu'à un endroit.

L'en-tête doit inclure uniquement la déclaration de la fonction d'événement et le code implémentant la fonction doit figurer dans un fichier .c.

par exemple.

dans event.h

void event(); 

et en tout seul fichier .c - pourrait être l'une des main.c ou other.c ou probablement mieux un event.c de fichier séparé

void event() 
{ 
    printf("Hello\n"); 
} 
+0

Merci - c'est la solution dont j'ai besoin – CaptainProg

+3

"L'en-tête doit inclure uniquement la [** déclaration **] de la fonction d'événement ...". * La déclaration * et * la définition * ne sont pas des termes interchangeables en C++. Vous auriez aussi pu utiliser le terme * prototype *. –

+0

@Emile - oui je sais - une faute de frappe - j'ai eu le bon en première ligne et passé du temps à double vérification mais manqué :) – Mark

1

Vous ne devez pas définir event() dans event.h. Parce que event.h est inclus à la fois dans main.c et other.c, il finit par être défini deux fois.

Vous devez le déclarer dans event.h, avec la signature de la fonction, tels que:

void event();

Et mettre la définition dans un fichier event.c où vous mettrez le corps de la fonction. La fonction sera définie uniquement dans ce fichier event.c et les deux autres fichiers .c incluront uniquement la déclaration.

1

Je suppose que vous avez défini event() dans event.h, comme ceci:

void event() 
{ 
.... 
} 

Mais en-tête que vous VHA e à déclarer fonction, puis définir il en .cpp Donc, vous devez faire ce qui suit: événement.h

// declaration 
void event(); 

event.cpp

#include "event.h" 
// implementation 
void event() 
{ 
.... 
} 
1

Vous avez deux choix: soit ne définissent pas la fonction dans l'en-tête, ou définir comme ligne. Le premier est couvert dans d'autres réponses, et celle-ci est aussi facile que préfixer « en ligne » à la définition de la fonction:

inline 
void example() { 
    do_stuff(); 
} 

Si vous voulez définir la ligne de fonction ou non est, aujourd'hui, tout au sujet de votre convenance et pas sur l'optimisation. Qu'est-ce qui est le plus facile pour vous? Les fonctions en ligne sont presque toujours plus faciles à utiliser (c'est-à-dire le prototypage et les premières versions); vous pouvez toujours inverser cette décision, si nécessaire, plus tard.

Questions connexes