是否建议在函数中使用 using 关键字?[已结束]

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

提问人:DigitalEye 提问时间:11/8/2019 更新时间:11/8/2019 访问量:144

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章来用事实和引文来回答。

4年前关闭。

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

void foo()
{
  using namspace namesp1::namesp2;

  // do foo stuff
}

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

使用 using 指令的 C++ 命名空间

评论

1赞 M.M 11/8/2019
对我来说似乎很好
3赞 NathanOliver 11/8/2019
FWIW 我总是喜欢完全限定这个名字。如果名字很长,你可以做一个别名,让你的生活更轻松。当您只导入所有名称时,您可能会发生冲突。
0赞 Eljay 11/8/2019
取决于您团队的惯例,或者您对什么感到满意。这在语言中是完全合法的。我担心的是,它可能会引入比您需要的更多的符号,并且随着事物的发展,可能会引入一个相互冲突的标识符。当我有来自另一个命名空间的标识符时,我的偏好是显式地拉入标识符(例如,),而不是整个命名空间(例如,)。usingusing std::cout;using namespace std;
2赞 11/8/2019
我不想在文件范围内添加它并将所有出现的 xxx::typename 编辑为 typename如果我没记错的话,即使使用 .using
2赞 MSalters 11/8/2019
@Chipster:没错。有助于查找不合格的名称;限定名称查找不受影响。(除非你有像 .不要那样做。usingnamespace xxx { int std;

答:

4赞 P.P 11/8/2019 #1

它本身就存在一些问题。如果将问题放在文件范围内,无论存在什么问题,仍然存在,但仅限于函数。 当您必须键入很长的类型名称 () 时,这通常是一个合理的折衷方案。using namespace blah;foo::bar::blah::something::thingy var;

一个稍微好的选择是使用别名:

void foo()
{
    using p1p2 = namesp1::namesp2;

    // do stuff
}

然后,您可以使用 这使得命名空间冲突的可能性更小。p1p2::thingy

评论

0赞 DigitalEye 11/8/2019
这正是我的问题,有许多嵌套的命名空间。我通常定义别名以使我的 STL 数据成员更具可读性,但在函数中使用它们以防止繁琐的键入也同样有效。我将采用这种方法。
0赞 DigitalEye 11/12/2019
using 关键字在此上下文中不起作用。我想你的意思是说namespace p1p2 = namesp1::namesp2
0赞 P.P 11/12/2019
创建别名@DigitalEye自 C++11 起有效。你所拥有的也会起作用。using
0赞 P.P 11/12/2019
en.cppreference.com/w/cpp/language/type_alias 的例子很少。
3赞 463035818_is_not_an_ai 11/8/2019 #2

拉入完整的命名空间有几个不好的后果。请看这个例子

void foo() {
    using namspace A;
    using namspace B;
    bar();              
    A::moo();           
    B::moo();  
};
  • 更难看出符号来自哪个命名空间。是来自还是来自?或者也许来自全局命名空间?barAB
  • 符号(例如)在多个命名空间中声明,无论如何,您都必须完全限定。moousing
  • 假设是从 ,如果在以后的某个时间点添加代码将中断barABbar

最好只使用您需要的东西:

void foo() {
    using A::bar;
    bar();
}