我知道使用命名空间的可能性更大。通过在开头使用语法using namespace std;
,它会加载所有std
命名空间,但我只使用了一些(cout
,cerr
,endl
, vector
,string
)。
你怎么建议我这样做:
using namesapace std
- 加载所有内容?using std::cout; using std::endl; using std::cerr; using std::vector; using std::string
- 正好加载我需要的东西?cout
,cerr
,endl
,vector
,string
之前调用命名空间? 答案 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::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
我提到的第一个案例。
答案 1 :(得分:2)
答案至少在某种程度上是基于意见的。唯一的&#34;规则&#34;我建议不要在头文件中using namespace std
(或任何其他命名空间),因为然后你会对包含你的每个人造成using
。
在cpp文件中,有更多的灵活性。就个人而言,我几乎总是跳过using
并在需要时输入std::
。它不会那么久,它会让你明白你正在尝试做什么,如果你碰巧使用一个标准库名称来处理你自己的一个函数或类,它就会阻止名称冲突。
答案 2 :(得分:0)
这实际上是一个偏好和代码范围的问题。
如果你只是编写简单的短代码,那么你应该选择第一个,而不要考虑太多。但是,如果您要编写包含许多块和非本地化变量的代码,则应考虑定义命名空间。