【发布时间】:2011-02-21 13:47:58
【问题描述】:
编辑:我知道方法 1 本质上是无效的,并且可能会使用方法 2,但我正在寻找最好的 hack 或更好的解决方案来缓解猖獗的、可变的命名空间扩散。
我在一个命名空间中有多个类或方法定义,它们具有不同的依赖关系,并且希望尽可能使用最少的命名空间块或显式范围,但同时将 #include 指令与尽可能需要它们的定义进行分组。我从来没有看到任何迹象表明可以告诉任何预处理器从#include 内容中排除命名空间 {} 范围,但我在这里询问是否有可能进行类似的操作:(请参阅底部以了解为什么我想要一些死的东西简单)
// 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
我真正的问题是,我的项目可能需要对模块进行分支,但在同一程序中的分支中存在共存的组件。我有像 FooA 之类的类,我称之为 Foo::A,希望能够像 Foo::v1_2::A 那样痛苦地分支,其中一些程序可能需要 Foo::A 和 Foo ::v1_2::A。如果可能的话,我希望“Foo”或“Foo::v1_2”每个文件只显示一次,作为单个命名空间块。此外,我倾向于将#include 指令块定位在文件中需要它们的第一个定义的正上方。我最好的选择是什么,或者,我应该做什么而不是劫持命名空间?
【问题讨论】:
-
我刚刚选择了选项 #2,并尝试使用包含的内容尽可能干净。
标签: c++ namespaces include