Question

Un peu d'une question académique, mais je suis tombé sur ce tout en écrivant des tests unitaires.

Mon cadre de test unitaire (UnitTest ++) vous permet de créer struct pour servir de luminaires. En général, ceux-ci sont adaptés aux tests dans le fichier, alors je les ai mis en haut de mon dossier de test unitaire.

//Tests1.cpp

struct MyFixture {  MyFixture() { ... do some setup things ...} };

TEST_FIXTURE(MyFixture, SomeTest)
{
  ...
} 

//Tests2.cpp

struct MyFixture { MyFixture() { ... do some other setup things, different from Tests1}};

 TEST_FIXTURE(MyFixture, SomeOtherTest)
 {
  ...
 }

Cependant, je trouve récemment (avec VS2005 au moins) que lorsque vous nommez le struct appareil en utilisant le même nom (maintenant deux versions du struct existent avec le même nom), puis l'une des versions est silencieusement jeté . Ceci est assez surprenant, parce que j'ai mon compilateur réglé sur / W4 (la plus haute niveau d'alerte) et aucun avertissement sort. Je suppose que cela est un choc de nom, et pourquoi les espaces de noms ont été inventées, mais ai-je vraiment besoin d'envelopper chacun de mes appareils de test unitaires dans un espace de noms distinct? Je veux juste vous assurer que je ne manque pas quelque chose de plus fondamental.

Y at-il une meilleure façon de résoudre ce problème - si cela se passe? Ne devrais-je voir un des symboles de double erreur ou quelque chose?

Était-ce utile?

La solution

Essayez de coller les classes dans un espace de noms anonyme, vous trouverez peut-être moins de mauvais goût que d'avoir à créer et nommer un nouvel espace de noms pour chaque fichier.

Ne pas avoir accès à l'unité VS2005 et Cpp, mais cela peut fonctionner ..

//Tests1.cpp
namespace
{
struct MyFixture {  MyFixture() { ... do some setup things ...} };
}

TEST_FIXTURE(MyFixture, SomeTest)
{
  ...
} 


//Tests2.cpp
namespace
{
struct MyFixture { MyFixture() { ... do some other setup things, different from Tests1}};
}

TEST_FIXTURE(MyFixture, SomeOtherTest)
{
 ...
}

Autres conseils

Le compilateur ne fonctionne que sur une seule unité de compilation à la fois; ce serait le fichier source et tout ce qu'il #Includes. Étant donné que vos classes sont dans des fichiers différents, pas de conflit là.

Le groupe de liaison met tout ensemble, mais il ne connaît pas les définitions de classe de sorte qu'il ne voit pas de conflit soit.

De retour dans les jours de C, il était assez courant pour l'éditeur de liens de reconnaître que vous avez eu deux fonctions différentes avec le même nom et générer un message d'erreur. Avec fonctions en ligne et les modèles en C ++, il ne peut pas faire plus -. Différentes unités de compilation contiennent souvent des copies de la même fonction, de sorte que l'éditeur de liens suppose que ce sont les mêmes

Ceci est essentiellement une conséquence du fait que les classes doivent être définies dans les fichiers d'en-tête, ce qui conduit à avoir des définitions redondantes de la classe dans chaque fichier objet. Ainsi, un agent de liaison qui peut gérer la liaison de C doit plier les déclarations de classes redondantes ensemble et prétendre que la classe a été déclarée une seule fois.

Il n'y a aucun moyen pour l'éditeur de liens de distinguer entre une classe unique inclus dans plusieurs objets et plusieurs classes avec le même nom dans plusieurs objets.

Vous devez utiliser les espaces de noms (ou une meilleure langue), pour contourner cela.

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