是否建议在函数中使用using关键字

Is it recommended to use the using keyword in a function?

本文关键字:using 关键字 函数 是否      更新时间:2023-10-16

我正在编辑一个由其他人编写的大型源文件。他们没有将using namespace xxx指令放在文件范围内,我也不想将其添加到文件范围内并编辑xxx::typenametypename的所有出现。但是,同时,我不想在这个文件中编写的新函数中不断键入所有这些长嵌套的命名空间名称,所以我决定在函数中使用using指令,如下所示:

void foo()
{
using namspace namesp1::namesp2;
// do foo stuff
}

这段代码编译得很好,但我不确定是否有任何问题。是否有任何规则规定何时应该首选文件或函数范围?

有这样的gotchas。如果将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();
}