Question

Apparemment, MSVC2005 n'inline les fonctions membres de classes locales qui conduit à LNK2005.

Je suis face à cette erreur de LNK2005 lors de la compilation de ce qui suit:

Contenu de common.h:

inline void wait_what()
{
  struct wtf
  {
    void ffffuuu() {}

  } local;
}

Contenu de foo.cpp:

#include "common.h"

void foo()
{
  wait_what();
}

Contenu de bar.cpp:

#include "common.h"

void bar()
{
  wait_what();
}

Contenu de LNK2005.cpp:

// forward declarations
void foo();
void bar();

int main()
{
  foo();
  bar();

  return 0;
}

Le message d'erreur est:

error LNK2005: "public void __thiscall `void__cdecl wait_what(void)'::`2'::wtf::ffffuuu(void)" (?ffffuuu@wtf?1??wait_what@@YAXXZ@QAEXXZ) already defined in bar.obj

A propos des classes locales, ISO IEC 14882-2003 dit:

  

9.8 déclarations de classe locales

     

Une classe peut être définie dans une définition de fonction; une telle classe est appelée locale classe. Le nom d'une classe locale est locale à sa portée englobante. La classe locale est dans le cadre de la portée englobante, et a le même accès aux noms en dehors de la fonction tout comme la fonction englobante. Les déclarations dans une classe locale peuvent utiliser des noms de type uniquement, les variables statiques, variables et fonctions externat, et les agents recenseurs de la portée englobante.

     

Une fonction d'enceinte n'a pas un accès privilégié à des membres de la classe locale; elle obéit aux règles d'accès habituelles (article 11). Les fonctions membres d'une classe locale sont définies dans leur définition de la classe, si elles sont définies du tout.

Ai-je raté quelque chose?

Pour moi, on dirait qu'il est un bug du compilateur. GCC et MSVC2008 le compiler très bien. Cependant, je me demande s'ils vraiment inline l'appel ou tout simplement jeter l'un des deux symboles pendant la phase de liaison. Comme une note intéressante, vous pouvez remarquer qu'il n'y a même pas appel à cette fonction de membre de la classe locale.

Je me demande s'il y a une solution de contournement pour MSVC2005. J'ai essayé de rechercher MSDN pour ce problème typique sans beaucoup de succès: je n'étais pas capable de trouver une liste des bogues connus pour le compilateur

.

Pièce jointe: LNK2005.zip

Était-ce utile?

La solution

il était un bogue dans Visual Studio 2005, il a été fixé en 2008 vs

Autres conseils

Il ressemble à un bug pour moi. Peut-être que la raison pour laquelle cela fonctionne dans VS2008. (Ce qui est d'ailleurs, Microsoft, une bonne raison pour briser la dépendance IDE / compilateur dans Visual Studio.)

En ce qui concerne une solution de contournement, essayez d'ajouter explicitement inline, ou non inline wait_what.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top