2010-07-08 3 views
2

J'ai une bibliothèque statique qui (entre autres choses) implémente une minuscule fonction qui ne retourne que de la chaîne d'une table de const constings. Cette fonction n'est appelée nulle part dans la bibliothèque, mais elle est déclarée comme inline. Pour plus de clarté, il ressemble à ceci:Problème avec la liaison avec une bibliothèque statique qui a des fonctions en ligne

namespace flow 
{ 
    inline const char* GetName(BYTE methodType); 
} 

et la mise en œuvre:

const char* flow::GetName(BYTE methodType) 
{ 
    if (methodType < 5) 
     return cszNameTable[ methodType ]; 

    return NULL; 
} 

Dans un autre projet, je suis lien avec cette librairie. J'ai les bons fichiers .h inclus et j'ai le using namespace flow; dans mon code. Le problème est, je reçois des erreurs de l'éditeur de liens:

error LNK2001: unresolved external symbol "char const * __cdecl flow::GetName(unsigned char)" ([email protected]@@[email protected]) 

Maintenant, je peux facilement corriger cela en supprimant le mot-clé « en ligne » de la déclaration de fonction dans la bibliothèque statique. Voici donc mes questions:

1) Pourquoi cette erreur apparaît-elle? Comment puis-je le corriger sans modifier le code source de la bibliothèque statique (sans supprimer le mot-clé inline)?

2) Quel est l'avantage d'utiliser le mot-clé inline dans une fonction de bibliothèque statique qui est pas appelé dans la bibliothèque elle-même? Est-ce que le mot-clé inline a un effet lors de la liaison avec la bibliothèque d'un autre projet (je suppose que oui, mais je ne suis pas sûr)?

+0

Ceci peut être évident, mais l'implémentation est-elle également dans l'en-tête? – Staffan

+0

Quel est le '__cdecl' dans l'erreur? Le déclarez-vous 'extern 'quelque part? – Stephen

+0

@Staffan: non ce n'est pas, je ne suis pas l'auteur du code, j'ai juste accès. La bibliothèque compile bien cependant, alors peut-être que c'est la raison pour laquelle l'auteur n'a pas vu cette erreur (et la même chose va avec moi, oh boy) – PeterK

Répondre

5

1) Pourquoi cette erreur apparaît-elle? Comment puis-je le corriger sans modifier le code source de la bibliothèque statique (sans supprimer le mot-clé inline)?

Il n'y a aucun point déclarant fonctions inline. Vous devez définir les dans l'en-tête de toute façon:

namespace flow 
{ 
    inline const char* GetName(BYTE methodType) 
    { 
     if (methodType < 5) 
      return cszNameTable[ methodType ]; 

     return NULL; 
    } 
} 

2) Quel est l'avantage d'utiliser le mot-clé en ligne dans une fonction de bibliothèque statique qui n'est pas appelée dans la bibliothèque elle-même? Est-ce que le mot-clé inline a un effet lors de la liaison avec la bibliothèque d'un autre projet (je suppose que c'est le cas, mais je ne suis pas sûr)?

L'effet de inline est que vous pouvez, et doivent, définir la fonction dans l'en-tête, car la mise en œuvre d'une fonctioninlinedoit être visible lorsque cette fonction est appelée .

+0

En effet. http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.6 – Stephen

+1

La raison de l'erreur de l'éditeur de liens est donc que l'implémentation n'est pas dans le fichier d'en-tête? (Comme je l'ai dit dans les commentaires à ma question). – PeterK

+0

En fait, vous n'avez pas besoin de le définir "tout de suite". Vous pouvez utiliser une déclaration séparée suivie d'une implémentation distincte. Les deux doivent toujours être dans la tête si. – Staffan

0

Il est un vieux sujet, mais certains peuvent encore se demander:

Déclaration

(fichier .h):

const char* flow::GetName(BYTE methodType) 

mise en œuvre (.fichier cpp):

extern inline const char* flow::GetName(BYTE methodType) 
{ 
    if (methodType < 5) 
     return cszNameTable[ methodType ]; 

    return NULL; 
} 
Questions connexes