在实现文件中使用指令

时间:2015-11-18 06:17:07

标签: c++ namespaces using

在C ++ Primer中,有一个提示说:

  

using指令有用的地方在于实现   命名空间本身的文件。

我想这只是用于使用简写名称?我不确定它与仅用

实现的实现有什么不同
namespace namespace_name
{
}

感谢。

2 个答案:

答案 0 :(得分:1)

这适用于对您自己的命名空间的修改。 using指令的目的是从不同的命名空间导入符号。例如,一个臭名昭着的习语:

namespace my_stuff
{
  template <typename Container>
  void my_fn( Container& xs )
  {
    using std::begin;
    using std::end;
    std::sort( begin(xs), end(xs) );
  }
}

所有内容都发生在您的 my_namespace中,但如果需要,它会提供std::begin()std::end()个功能。如果存在begin()end()的更本地定义更好地匹配Container类型,则将使用它。如果您只是将所有内容都包装在std命名空间中,那么这种有用的功能就会丢失。

希望这有帮助。

答案 1 :(得分:1)

  

我不确定与namespace namespace_name { }

围绕实施的区别

这是将您自己的代码放在命名空间中,而不是使用其他命名空间中的某些名称。假设您在draw命名空间内编写了Graphics函数 - 要执行此操作,请将draw的代码包装在namespace Math { void draw() { /* some code */ } }中并使用它&#39} ; d做Graphics::draw。但是,如果您需要在gamma命名空间(您没有写过)中使用某个功能Math,那么您可以将其称为Math::gamma编译器知道在哪里搜索gamma。或者,您可以使用速记来删除Math::部分。

  

我想这只是用于使用简写名称?

是的,允许在没有限定符的情况下使用某些命名空间中的标识符。有两种方法可以做到。

  1. Using directive:使用名称空间中没有限定条件的所有名称(例如using namespace Math;
  2. Using declaration:只使用一些没有限定条件的指定名称(例如using Math::gamma) - 这通常比前者好。
  3. 但是,我们鼓励两者仅在实现/源文件中使用,而不是在标题中使用,以避免某些源可能拥有自己的gamma副本并且不想使用{{ 1}},但由于你在标题中有它,它会引起名字的冲突。有关"using namespace" in c++ headers的更多详情。