C++使用NAMPSPASSTD,使用STD::XXX或仅仅STD::x?
我知道使用名称空间有更多的可能性。通过使用命名空间std的语法;开始时,它加载所有std名称空间,但我只使用了一些cout、cerr、endl、vector和string 你建议我怎么做: 使用Namespace std-全部加载吗? 使用std::cout;使用std::endl;使用std::cerr;使用std::vector;使用std::string-加载我需要的内容? 在每个cout、cerr、endl、vector、string之前调用名称空间?C++使用NAMPSPASSTD,使用STD::XXX或仅仅STD::x?,c++,namespaces,C++,Namespaces,我知道使用名称空间有更多的可能性。通过使用命名空间std的语法;开始时,它加载所有std名称空间,但我只使用了一些cout、cerr、endl、vector和string 你建议我怎么做: 使用Namespace std-全部加载吗? 使用std::cout;使用std::endl;使用std::cerr;使用std::vector;使用std::string-加载我需要的内容? 在每个cout、cerr、endl、vector、string之前调用名称空间? 答案至少有点基于观点。我建议的唯一
答案至少有点基于观点。我建议的唯一规则是永远不要在头文件中使用namespace std或任何其他名称空间,因为这样会使包括您在内的所有人都使用该名称空间 在cpp文件中,有更多的灵活性。就我个人而言,我几乎总是跳过使用std::并在需要时键入它。它没有那么长,它可以让您清楚地知道您要做什么,并且如果您碰巧为自己的函数或类使用了标准库名称,它可以防止名称冲突。通常,避免在头文件中使用全局范围 例如:
#ifndef HEADER_H
#define HEADER_H
#include <string>
using std::string; // bad
string s();
#endif
在实现文件或头文件中的内联函数体中,可以更自由地使用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
你肯定会听到很多有能力的程序员对此表示支持和反对。我认识的每一位有能力的程序员都同意的唯一一件事就是避免使用我提到的第一种情况。这实际上是一个偏好和代码范围的问题
如果您只编写简单的短代码,那么您可能应该使用第一个代码,不要想太多。但是,如果编写多个块和非本地化变量的代码,则应该考虑定义命名空间。 这要看情况而定。你的代码库目前做什么?@DanielA.White你能举一些例子吗?我不太清楚。在什么的开头?我会说随便哪一个,但它们都不会在头文件中,永远不会。这是个人的。我强制执行一个编码标准,不在头中使用。就我个人而言,我也很少在资源中使用它们。例如,在您的例子中,您可能正在将boost::shared_ptr与C++11之前的版本一起使用。然后迁移到C++11,得到std::shared\u ptr。现在你有一个冲突。boost中的东西有变成std的习惯。@theDarksideofmon:再看看我的答案。never use in Header太宽泛了,因为内联函数可能出现在Header中,内联函数使用也可以。是的,这是cv和std中的vector的情况。bothI应该补充一点,虽然我忘了提到它,但我完全同意在块范围内使用。确实,从未在Header中使用过,其余的是有争议的,在我看来都是正确的
#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
#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