显式声明全局命名空间

5

在另一个命名空间中是否可以声明全局命名空间的变量或函数?目前我的代码看起来像这样。

namespace test {
//do stuff
}

//declare global stuff

namespace test{
//continue stuff
}

这个问题的出现是因为我在命名空间内使用了#include,但是其中一部分包含的代码需要在全局命名空间中。因此,我不能打断或编写超出我的命名空间块之外的代码。

因此,我想要:

namespace {// do stuff
//declare global stuff
//do more stuff
}

现在我的代码看起来有点像:

namespace test{
void majorfcn1();
Void majorfcn2();
#include "minorfunctions.h"
}

如果只有函数,那就没有问题。但在我的情况下,我还引入了其他一些包含文件,当然应该是要在全局空间中使用的。因此,我希望能够保留它们并将它们放置在 namespace global{} 中。


1
通常情况下,不要在命名空间内使用 #include -- 这会完全破坏头文件内容的抽象性(您需要知道它如何声明所有内容以及声明了什么内容才能安全地在命名空间内进行 #include)。 - Cameron
我认为你的第一个片段很好。 - Quentin
因为我想保持我的类接口干净,所以我把辅助函数放在一个单独的文件中并包含它们。 - jiggunjer
@Quentin 是的,但如果我使用 include 在命名空间块中注入代码,则这不是一个选项。在文件内部没有任何指示表明它在主模块的命名空间中。 - jiggunjer
当与命名空间内的类相关联时,为什么需要将某些内容放入全局命名空间中?此外,如果这些是辅助函数,为什么不在打开命名空间之前将其包含在文件开头?提供一个你想要实现的示例会更有帮助。 - MikeMB
显示剩余3条评论
1个回答

2
答案是否定的。我建议您不要在命名空间内部使用#include,这不符合传统的C++编码规范。
您说您想要:
namespace {// do stuff
//declare global stuff
//do more stuff
}

那么你只需要执行以下操作:

namespace {// do stuff
}

//declare global stuff

namespace {// do stuff
//do more stuff
}

谢谢。如果可能的话,我可以使用预处理器来创建一个干净的接口并保持我的包含文件的完整性。现在我需要两个包含文件或者一个在一个丑陋的地方... - jiggunjer
我编辑了我的答案,试图展示如何在没有预处理魔法的情况下完成这个问题。这回答了你的问题吗? - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接