使用命名空间std,使用std::xxx或仅使用std::x



我知道使用名称空间有更多的可能性。通过在开始时使用语法using namespace std;,它正在加载所有std名称空间,但我只使用几个(cout, cerr, endl, vector, string)。

你建议我怎么做:

  1. using namesapace std -全部加载?
  2. using std::cout; using std::endl; using std::cerr; using std::vector; using std::string -加载只是我需要什么?
  3. 在每个cout, cerr, endl, vector, string之前调用命名空间?

一般来说,避免在头文件的全局作用域使用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::string, std::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

答案至少在某种程度上是基于意见的。我建议的唯一"规则"是永远不要在头文件中使用using namespace std(或任何其他名称空间),因为这样你就会把using强加给包括你的每个人。

在cpp文件中,有更多的灵活性。就我个人而言,我几乎总是在需要时跳过using并键入std::。它不是很长,它使您想要做的事情很明显,并且如果您碰巧为自己的一个函数或类使用一个标准库名称,它可以防止名称冲突。

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

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

最新更新