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

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

我正在编辑一个由其他人创作的大型源文件。他们没有将 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();
}