屏蔽#include在namespace {}块中?

Jef*_*eff 17 c++ namespaces include

编辑:我知道方法1本质上是无效的,可能会使用方法2,但我正在寻找最好的黑客或更好的解决方案来缓解猖獗的,可变的命名空间扩散.

我在一个名称空间中有多个具有不同依赖关系的类或方法定义,并且希望尽可能使用最少的命名空间块或显式scopings,但是将#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
Run Code Online (Sandbox Code Playgroud)

...

// 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
Run Code Online (Sandbox Code Playgroud)

...

// 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
Run Code Online (Sandbox Code Playgroud)

我真正的问题是我有一个项目,其中模块可能需要分支,但在同一程序中具有来自分支的共存组件.我有类似FooA等的类,我称之为Foo :: A,希望能够像Foo :: v1_2 :: A那样痛苦地分支,其中某些程序可能需要Foo :: A和Foo :: V1_2 ::一个.我希望"Foo"或"Foo :: v1_2"只显示每个文件一次,如果可能的话,作为单个命名空间块.此外,我倾向于在需要它们的文件中的第一个定义的正上方找到#include指令块.什么是我最好的选择,或者我应该做什么而不是劫持命名空间?

Tim*_*mbo 38

只需将#including视为将包含文件的内容复制并粘贴到#include指令的位置即可.

这意味着,是的,包含文件中的所有内容都将位于命名空间内.

  • 因为`#define`s没有任何名称空间的概念 (8认同)
  • 请注意,任何`#define`s都不在命名空间内. (7认同)
  • 谢谢,我已经接受了它是相当盲目的工具的预处理器。 (2认同)

Mar*_*ork 16

问:你可以:
A:是的,你可以.include语句在预处理期间完成,然后编译器才会看到它.

问:这是个好主意.
答:可能不是.

如果#include Apple.g没有命名空间标记会发生什么.
现在你在全局命名空间中声明了苹果以及foo命名空间.

您应该尝试避免代码用户需要了解应该如何使用它的情况.如果您的文档总是#include foo名称空间内的苹果头文件,那么用户将无法读取并导致数小时混淆.