C ++使用命名空间std,使用std :: xxx还是只使用std :: x?

时间:2014-06-19 13:02:38

标签: c++ namespaces

我知道使用命名空间的可能性更大。通过在开头使用语法using namespace std;,它会加载所有std命名空间,但我只使用了一些(coutcerrendlvectorstring)。

你怎么建议我这样做:

  1. using namesapace std - 加载所有内容?
  2. using std::cout; using std::endl; using std::cerr; using std::vector; using std::string - 正好加载我需要的东西?
  3. 在每个coutcerrendlvectorstring之前调用命名空间?

3 个答案:

答案 0 :(得分:7)

通常,在头文件中避免using在全局范围内。

示例:

#ifndef HEADER_H
#define HEADER_H

#include <string>

using std::string; // bad

string s();

#endif

如果您执行此操作,则强制using降低每个人的喉咙,包括标题:

#include "header.h" // also got `std::string`, which I perhaps didn't want

在实现文件或头文件中的内联函数体中,using可以更自由地使用:

#ifndef HEADER_H
#define HEADER_H

#include <string>

template <class T>
std::string f(T t) // still explicitly qualifying here
{
  using std::string; // OK
  string s = "...";
  // ...
}

#endif

但是,请注意,只是明确限定所有内容,即在任何地方编写std::stringstd::cout等,这是一种非常普遍的接受方式。我个人这样做:

#ifndef HEADER_H
#define HEADER_H

#include <string>

template <class T>
std::string f(T t) // explicitly qualifying here
{
  std::string s = "..."; // and here, too
  // ...
}

#endif

你肯定会听到很多有能力的程序员争论赞成和反对它。我认识的每个有能力的程序员都同意的唯一一件事就是避免using我提到的第一个案例。

答案 1 :(得分:2)

答案至少在某种程度上是基于意见的。唯一的&#34;规则&#34;我建议不要在头文件中using namespace std(或任何其他命名空间),因为然后你会对包含你的每个人造成using

在cpp文件中,有更多的灵活性。就个人而言,我几乎总是跳过using并在需要时输入std::。它不会那么久,它会让你明白你正在尝试做什么,如果你碰巧使用一个标准库名称来处理你自己的一个函数或类,它就会阻止名称冲突。

答案 2 :(得分:0)

这实际上是一个偏好和代码范围的问题。

如果你只是编写简单的短代码,那么你应该选择第一个,而不要考虑太多。但是,如果您要编写包含许多块和非本地化变量的代码,则应考虑定义命名空间。