有没有办法限制头文件中“使用命名空间”指令的效果?

Is there a way to limit the effect of "using namespace" directives in a header file?

提问人:Dimitri C. 提问时间:6/22/2009 最后编辑:Jan SchultkeDimitri C. 更新时间:9/28/2023 访问量:4425

问:

我喜欢 C++ 命名空间的概念,因为它们有助于保持源代码简洁,同时避免名称冲突。在 .cpp 文件中,使用“using namespace”声明,这非常有效。但是,在头文件中,这不能使用,因为它“打开”了命名空间,这意味着“使用命名空间”不仅适用于当前头文件,而且适用于此后编译的所有内容。这在一定程度上抵消了命名空间的优势。例如,考虑一个头文件,其中经常使用类“ourlib::networking::IpAddress”和“ourlib::filesystem::P ath”。

有没有办法限制头文件中“using namespace”声明的效果?

C++ 命名空间 头文件 using 指令

评论


答:

0赞 OregonGhost 6/22/2009 #1

您可以只导入单个类:

using ourlib::networking::lpAddress;

至少如果我没记错的话;)

不过,这仍然可能会污染全局命名空间。我倾向于只使用头文件中的长命名空间前缀。这样可以更轻松地为其他开发人员读取头文件(因为您不必查找哪个类来自哪个命名空间)。

评论

2赞 Artyom 6/22/2009
> 这可能会污染全局命名空间<这将污染全局命名空间
0赞 OregonGhost 6/22/2009
取决于你所说的污染是什么意思。在我看来,如果通过包含标头将其限制为实现文件,则导入单个类可以很好。我通常只在绝对必要时才在其他标头中包含标头,而是使用正向声明。不过,这是为了缩短编译时间。
0赞 OregonGhost 6/22/2009
我忘了补充,除此之外,我同意你的看法。正如我所说,我主要使用完全限定的名称。
4赞 Artyom 6/22/2009 #2

你可以把大多数经常使用的类放在 ::ourlib 命名空间中,比如

namespace ourlib {
   using networking::lpAddress;
}

因此,如果它们在项目中独一无二,您很可能不会有问题。所以,任何 放置在标题中,您可以直接访问而无需放入 全局命名空间(我假设你所有的标头都在里面lpAddressnamespace ourlib)

2赞 Dimitri C. 11/16/2009 #3

不,这不能:(