Ich habe ein Projekt mit einer Reihe von C++ Testdateien. Jede Testdatei deklariert eine Klasse wie folgt:Wie isoliert man zwei C++ Klassen mit dem gleichen Namen?
// test1.cpp
...
class Foo { void bar() {...} };
...
und
// test2.cpp
...
class Foo { void bar() {...} };
...
und so weiter.
Alles war in Ordnung, bis die Testsuite ziemlich groß wurde und der Inhalt der Foo
Klasse in einigen Testmodulen unterschiedlich wurde. Bei der Verknüpfung gehen die Dinge schief. Die Methoden der Klasse in jeder ELF-Datei werden als öffentliche schwache Symbole ("W" in nm
Notation) deklariert, und dies führt zum Aufrufen falscher Instanzen der Methode, z. tests1.cpp
ruft Foo::bar()
von tests2.cpp
.
Wie isoliert man eine Instanz von class Foo
von einer anderen?
Die Deklaration der Klasse mit __attributes__ ((visibility ("hidden")))
hilft nicht, die Symbole bleiben öffentlich.
Auch sicher kann ich Namespaces dafür verwenden, aber ich möchte diese Option vermeiden.
Irgendwelche Ideen?
Warum möchten Sie Namespaces lieber vermeiden? Es ist so ziemlich der Grund, warum sie erfunden wurden! – Steve
Sie könnten anonyme Namespaces verwenden und die Deklaration 'Foo' in einen' Namespace {Klasse Foo {...}; } sollte genauso funktionieren und den 'Foo' intern zur Kompilierungseinheit machen. – rodrigo
@Steve Ich möchte Dinge einmal beheben (z. B. in einem Makefile), anstatt jedes Mal einen neuen Namen für einen Namensraum zu erfinden. – krokoziabla