在实现文件中使用指令

Using Directives in Implementation Files

本文关键字:指令 实现 文件      更新时间:2023-10-16

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

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

我想这只是为了使用速记名称?我不确定它与仅围绕实现有何不同

namespace namespace_name
{
}

谢谢。

这适用于对您自己的命名空间的修改。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() 定义,并且与容器类型更匹配,则将改用该定义。如果您只是将所有内容包装在 std 命名空间中,那么这种有用的功能就会丢失。

希望这有帮助。

我不确定它与仅用namespace namespace_name { }围绕实现有何不同

这是将您自己的代码放在命名空间中,而不是使用另一个命名空间中的某个名称。假设你在 Graphics 命名空间中编写了一个 draw 函数——为此,你将draw的代码包装在 namespace Math { void draw() { /* some code */ } } 中,并使用它Graphics::draw。但是,当您需要使用函数(例如,gamma Math命名空间(不是您编写的(时,您必须Math::gamma调用它,以便编译器知道在哪里搜索gamma。或者,您可以使用速记来删除Math::部分。

我想这只是为了使用速记名称?

是的,这是为了允许在没有限定符的情况下使用来自某个命名空间的标识符。有两种方法可以做到这一点。

  1. Using 指令:使用命名空间中的所有名称而不加限定(例如 using namespace Math; (
  2. 使用
  3. 声明:仅使用一些指定的名称而不加限定(例如 using Math::gamma ( - 这通常比前者更好。

但是,两者都被鼓励只在实现/源文件中使用,而不是在标头中使用,以避免某些源代码可能有自己的gamma副本并且不想使用Math::gamma,但由于您在标头中拥有它,它会导致名称冲突。有关 c++ 标头中"使用命名空间"的更多详细信息。