Frage

Etwas von einer akademischen Frage, aber ich in dieser lief während einig Unit-Tests zu schreiben.

My Unit-Test-Framework (Unittest ++) können Sie structs erstellen, wie Armaturen zu dienen. Normalerweise werden diese individuell auf die Tests der Datei, so dass ich sie an der Spitze meiner Unit-Test-Datei.

//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)
 {
  ...
 }

Allerdings fand ich vor kurzem (mit VS2005 zumindest), dass, wenn Sie das Gerät struct denselben Namen (so jetzt zwei Versionen der Struktur gibt es mit dem gleichen Namen) verwenden, dann eine der Versionen leise ist geworfen . Das ist ziemlich überraschend, weil ich mein Compiler Set / W4 (höchste Warnstufe) haben und keine Warnung kommt. Ich denke, dies ist ein Name Zusammenstoß ist, und warum Namensräume wurden erfunden, aber brauche ich wirklich jeden meiner Einheit Prüfvorrichtungen in einem eigenen Namensraum zu wickeln? Ich möchte nur sicherstellen, dass ich nicht etwas grundlegen fehlt.

Gibt es einen besseren Weg, dies zu beheben - soll dies geschehen? Soll ich nicht ein Duplikat Symbol Fehler oder etwas sehen?

War es hilfreich?

Lösung

Versuchen Sie, die Klassen in einem anonymen Namespace kleben, können Sie finden es weniger widerwärtig als mit einem neuen Namensraum für jede Datei zu erstellen und zu benennen.

Do hat Zugriff auf VS2005 und Cpp Einheit nicht aber das kann funktionieren ..

//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)
{
 ...
}

Andere Tipps

Der Compiler funktioniert nur auf einer einzige Übersetzungseinheit zu einer Zeit; dies würde die Quelldatei und alles sein, es #include. Da Ihre Klassen in verschiedenen Dateien sind, kein Konflikt gibt.

Das Linker setzt alles zusammen, aber es weiß nicht, über Klassendefinitionen, so dass es keinen Konflikt entweder nicht sehen.

Zurück in den Tagen von C, war es durchaus üblich, für die Linke zu erkennen, dass Sie mit dem gleichen Namen zwei verschiedene Funktionen hatten und eine Fehlermeldung generiert. Mit Inline-Funktionen und Vorlagen in C ++, kann es das nicht mehr -. Verschiedene Übersetzungseinheiten werden häufig Duplikate der gleichen Funktion enthalten, so dass der Linker übernimmt nur sind sie die gleiche

Dies ist im Wesentlichen eine Folge der Tatsache, dass Klassen in Header-Dateien definiert werden müssen, was dazu führen, mit redundanten Definitionen der Klasse in jeder Objektdatei. So ein Linker, der C ++ Verknüpfung verarbeiten kann redundante Klassendeklarationen zusammen und so tun, falten, dass die Klasse nur einmal erklärt wurde.

Es gibt keine Möglichkeit für den Linker zwischen einer einzelnen Klasse in mehrere Objekte und mehrere Klassen mit demselben Namen in mehrere Objekte enthalten, zu unterscheiden.

Sie haben Namespaces zu verwenden (oder eine bessere Sprache), diese zu umgehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top