Edit: Ich weiß, dass Methode 1 im Wesentlichen ungültig ist und wahrscheinlich Methode 2 verwenden wird, aber ich bin auf der Suche nach dem besten Hack oder einer besseren Lösung zur Minderung der grassierenden, veränderlichen Namespace-Proliferation.Abschirmung #include in Namespace {} Block?
Ich habe mehrere Klassen- oder Methodendefinitionen in einem Namespace, die unterschiedliche Abhängigkeiten haben und die wenigsten Namespace-Blöcke oder explizite Abtastungen verwenden möchten, aber gleichzeitig #include-Direktiven mit den Definitionen gruppieren, die sie so gut wie möglich benötigen. Ich habe nie einen Hinweis darauf gesehen, dass einem Präprozessor gesagt werden könnte, dass er das Namespace {} von #include-Inhalten ausschließt, aber ich bin hier, um zu fragen, ob etwas Ähnliches möglich ist: (siehe unten, um zu erklären, warum ich etwas tot haben will) einfach)
// NOTE: apple.h, etc., contents are *NOT* intended to be in namespace Foo!
// would prefer something most this:
#pragma magic_namespace_backout(1) // FIXME: use actually existing directive
namespace Foo {
#include "apple.h"
B *A::blah(B const *x) { /* ... */ }
#include "banana.h"
int B::whatever(C const &var) { /* ... */ }
#include "blueberry.h"
void B::something() { /* ... */ }
} // namespace Foo
...
// over this:
#include "apple.h"
#include "banana.h"
#include "blueberry.h"
namespace Foo {
B *A::blah(B const *x) { /* ... */ }
int B::whatever(C const &var) { /* ... */ }
void B::something() { /* ... */ }
} // namespace Foo
...
// or over this:
#include "apple.h"
namespace Foo {
B *A::blah(B const *x) { /* ... */ }
} // namespace Foo
#include "banana.h"
namespace Foo {
int B::whatever(C const &var) { /* ... */ }
} // namespace Foo
#include "blueberry.h"
namespace Foo {
void B::something() { /* ... */ }
} // namespace Foo
Mein wirkliches Problem ist, dass ich Projekte, wo ein Modul, aber c zu verzweigenden brauchen kann oexistierende Komponenten aus den Zweigen im selben Programm. Ich habe Klassen wie FooA usw., die ich Foo :: A genannt habe, in der Hoffnung, weniger schmerzhaft als Foo :: v1_2 :: A zu verzweigen, wo irgendein Programm sowohl ein Foo :: A als auch ein Foo benötigt :: v1_2 :: A. Ich möchte, dass "Foo" oder "Foo :: v1_2" nur einmal pro Datei angezeigt wird, wenn möglich als einzelner Namespace-Block. Darüber hinaus tendiere ich dazu, Blocks von # include Direktiven unmittelbar über der ersten Definition in der Datei zu finden, die sie benötigt. Was ist meine beste Wahl, oder alternativ, was sollte ich tun, anstatt die Namespaces zu entführen?
Ich ging nur mit Option # 2 und versuchen, so sauber wie möglich mit den enthalten. – Jeff