提问人:Dimitri C. 提问时间:6/22/2009 最后编辑:Jan SchultkeDimitri C. 更新时间:9/28/2023 访问量:4425
有没有办法限制头文件中“使用命名空间”指令的效果?
Is there a way to limit the effect of "using namespace" directives in a header file?
问:
我喜欢 C++ 命名空间的概念,因为它们有助于保持源代码简洁,同时避免名称冲突。在 .cpp 文件中,使用“using namespace”声明,这非常有效。但是,在头文件中,这不能使用,因为它“打开”了命名空间,这意味着“使用命名空间”不仅适用于当前头文件,而且适用于此后编译的所有内容。这在一定程度上抵消了命名空间的优势。例如,考虑一个头文件,其中经常使用类“ourlib::networking::IpAddress”和“ourlib::filesystem::P ath”。
有没有办法限制头文件中“using namespace”声明的效果?
答:
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;
}
因此,如果它们在项目中独一无二,您很可能不会有问题。所以,任何
放置在标题中,您可以直接访问而无需放入
全局命名空间(我假设你所有的标头都在里面lpAddress
namespace ourlib
)
2赞
Dimitri C.
11/16/2009
#3
不,这不能:(
评论