我正在编辑由其他人创作的大型源文件。他们没有将using namespace xxx
指令放入文件范围,并且我不想将其添加到文件范围并将所有出现的xxx::typename
修改为typename
。但是,与此同时,我不想在我正在此文件中编写的新函数中继续键入所有这些长嵌套的名称空间名称,因此,我决定像下面这样在函数内使用using指令:
void foo()
{
using namspace namesp1::namesp2;
// do foo stuff
}
此代码可以很好地编译,但是我不确定是否有任何陷阱。是否有规定何时应首选文件或功能范围的规则?
确实有麻烦。如果将using namespace blah;
放在文件范围内,无论存在什么问题,它仍然存在,但仅限于该函数。通常,当您必须键入非常长的类型名称(foo::bar::blah::something::thingy var;
)时,这是一个合理的折衷方案。
一个更好的选择是使用别名:
void foo()
{
using p1p2 = namesp1::namesp2;
// do stuff
}
然后,您可以使用p1p2::thingy
来减少名称空间冲突的可能性。
引入一个完整的名称空间会产生一些不良后果。考虑这个例子
void foo() {
using namspace A;
using namspace B;
bar();
A::moo();
B::moo();
};
bar
来自A
还是B
?还是来自全局名称空间?moo
)在多个名称空间中声明,而您是using
,无论如何都必须完全限定。bar
来自A
,如果稍后B
添加了bar
,则代码将中断只使用您需要的内容:
void foo() {
using A::bar;
bar();
}