2009-07-02 6 views
5

fonction non inline définie dans le fichier d'en-tête avec des gardesErreur du lieur lors de la définition de la fonction non intégrée dans le fichier d'en-tête?

#if !defined(HEADER_RANDOM_H) 
#define HEADER_RANDOM_H 
void foo() 
{ 
//something 
} 
#endif 

Résultats en erreur de liens: Déjà définis dans le fichier someother.obj Faire le fonctionnement en ligne de fonction bien, mais je ne suis pas en mesure de comprendre pourquoi la fonction est déjà erroring dans le premier cas.

Répondre

9

Si l'en-tête est inclus dans plusieurs fichiers source et que la fonction n'est pas marquée comme "en ligne", vous aurez plus d'une définition. Les gardes d'inclusion empêchent uniquement les inclusions multiples dans le même fichier source.

+0

Ya merci ......... – yesraaj

+0

Je voudrais aussi souligner que le mot-clé 'inline' n'est pas nécessaire quand on parle des méthodes classes définies dans la déclaration de classe http://stackoverflow.com/a/145952/ 2436175 – Antonio

4

Puisqu'il n'est pas en ligne, chaque unité de traduction aura sa propre copie de la fonction résultant en la définition de la fonction plusieurs fois.

7

Vous enfreignez the one definition rule. Si vous voulez définir une fonction directement dans l'en-tête, vous devez l'indiquer inline - cela permettra à la fonction d'être définie plusieurs fois. Notez également que inline n'a pas d'autre sens, en particulier il ne force pas le compilateur à des appels en ligne (contrairement à la croyance populaire).

Questions connexes