C++ 使用「;使用;在头文件中

C++ 使用「;使用;在头文件中,c++,namespaces,using,C++,Namespaces,Using,我明白,我不应该在头文件中使用此选项: using namespace foo; 因为它为使用我的头文件的任何人将名称空间foo引入全局范围 如果我在自己的命名空间中这样做,我可以防止这种情况发生吗?例如: namespace my_lib { using namespace foo; // my stuff // ... } 现在,使用名称空间foo应该限制在名称空间my_lib的范围内,对吗?是。这比在全局级别使用名称空间foo要好 如果使用foo::name语

我明白,我不应该在头文件中使用此选项:

using namespace foo;
因为它为使用我的头文件的任何人将名称空间foo引入全局范围

如果我在自己的命名空间中这样做,我可以防止这种情况发生吗?例如:

namespace my_lib
{
    using namespace foo;

    // my stuff
    // ...
}

现在,使用名称空间foo应该限制在名称空间my_lib的范围内,对吗?

是。这比在全局级别使用
名称空间foo
要好

如果使用
foo::name
语法,效果会更好

现在,使用名称空间foo应该限制在名称空间my_lib的范围内,对吗


对。它带来了命名空间
my_lib
中命名空间
foo
中的所有名称,这可能会导致
my_lib
中的名称冲突。这就是为什么
foo::name
是最受欢迎的方法。

是的,如果你这样做,那么它只会将
foo
中的所有名称带入
my_lib
——正如其他人所指出的,这可能是可取的,也可能是不可取的

除了其他人所说的之外,我还要注意的一件事是,您可以使用“名称空间内的using指令”的思想来模拟限制在类范围内的using指令。请注意,这是非法的:

class C
{
  using namespace boost; // for example

  // ...
};
但你可以这样做:

namespace C_Namespace {
  using namespace boost;

  class C
  {
  };
}

using C_Namespace::C; // bring C itself back into the global namespace

我想如果您真正想要的是能够定义某些东西(比如类),而不必一直编写特定的名称空间前缀,那么您可能会发现它很有用。

请注意,这会将名称空间
foo
的全部内容拖到名称空间
my_lib
。这真的是你想要的吗?这可能比污染全局名称空间要好,但您仍然在污染名称空间……您只是想缩短名称空间吗?在这种情况下,您需要的不是
foo::bar::box::action()
而是
my_lib::action()
名称空间别名
namespace my_lib=foo::bar::box我不同意始终使用完整名称空间名称是合适的。别名和在作用域中引入名称大大简化了代码。如果
my_lib
的用户几乎总是需要同时使用
foo
,那么组合他们的作用域是有意义的。@edA-qa-mort-ora-y:如果存在名称冲突呢?另外,
my_lib
可能引用其他十几个名称空间中的其他名称,那么这是否意味着它应该对所有名称空间使用
using namespace xyz
?我也赞成将名称纳入范围,因为这样可以使生成的代码更易于阅读。但是,有一些方法没有任何主要的缺点(例如,见下文)。冲突总是可能的,但我不认为它们的可能性会阻止您导入名称。如果一个名称空间要在另一个名称空间上分层,您只需避免冲突。如果两个名称空间完全不相关,则可能不应该导入名称。@edA qa mort-ora-y:您的评论并没有真正解决名称冲突的问题。正如我所说的,如果发生名称冲突怎么办?此外,将包含函数的多个名称引入范围可能会产生ADL和其他名称查找问题,这可能会产生意外的函数解析,等等!