在使用任何命名空间时,哪种是首选约定?
using namespace std;
或者using std::cin;
using std::cout;
还是
在代码中需要时调用函数?
std::cout<<"Hello World!"<<std::endl;
在使用任何命名空间时,哪种是首选约定?
using namespace std;
或者using std::cin;
using std::cout;
还是
在代码中需要时调用函数?
std::cout<<"Hello World!"<<std::endl;
这里提供了一个很好的解释,可以在这里找到。
第一种风格即使用命名空间“using namespace whatever”的做法完全打败了使用命名空间的初衷。除了在小代码片段中,你永远不应该使用它。(我甚至在那里也不用!:D)
第二种方法过于冗长。不切实际。
我个人喜欢第三种风格,即输入完整的名称(例如std::cout)。
请记住,代码被读取的次数比被编写的次数多得多,使用完全限定名称会使你的代码更易读。
using
可以让你的代码更加简明扼要。相比于std::string a; std::string b; std::string c; std::string d;
,using std::string; string a; string b; string c; string d
如何更冗长呢?如果你需要经常使用它,完全限定的名称会让人感到繁琐。而且,当已经有了std::string
时,谁还会手写自己的string
类呢?如果你说string x
,95%的情况下是指std::string
,而且每个人都知道。 - Chris Lutzusing namespace std;
会有任何问题。但是绝对不要在头文件中使用#1或#2。 - rlbond这个问题之前已经被问过很多次了,但是我的SO搜索技能似乎暂时失灵了。基本上:
永远不要在头文件中放置任何类型的using指令 - 这样做会污染您的代码并引入各种难以跟踪的错误。
最好在实现(.cpp)文件中使用类似using std::string
的using声明,如果该类型被广泛使用。
作为最后的选择,在实现文件中使用using namespace std
,但只限于实现文件 - 我在SO上发布可编译代码时使用它,以方便大家。
#include <vector> #include <algorithm> int main() { std::vector<int> foo; std::vector<int> bar; copy(foo.begin(), foo.end(), bar.begin()); }
。 - Steve Jessopusing namespace std;
using std::swap
std::swap
使用的想法,我个人不太同意。然而,在阅读了2000年的USENET帖子(http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/b396fedad7dcdc81)后,我对它更感兴趣了。个人而言,我更倾向于“使用`std::swap`并进行特化”的阵营。 - D.Shawleynamespace A { int a=0; }
namespace B { int a=0; }
你可以将其用作:
using namespace A;
using namespace B;
using namespace std;
cout<<a<<endl; //error here!
如果您可以简单地说:
std::cout<<B::a<<std::endl; //No problem, more readable
虽然打代码需要更多的时间,但第二和第三个选项更受欢迎。
#include <iostream>
using namespace std; // Pollution!
int main()
{
....
}
如果你想要导入命名空间,只需将其导入到你正在工作的范围即可:
#include <iostream>
int main()
{
using namespace std; // Good!
....
}
using namespace MyGraphLibrary;
就可以了。世界不会爆炸,你的代码也没问题。只要小心,它就不会污染代码。 - rlbond我想指出的是,using namespace foo
是有作用域的。例如:
#include <iostream>
#include <vector>
//...
for (int i=0; i<10; ++i)
{
using namespace std;
cout << i << endl;
}
vector v; // won't compile
当小心使用时,using namespace std
可以同时有用和无害。
我总是列出完整的命名空间。这样可以提高可读性,让其他人知道你的函数和数据来自哪里。当阅读其他人的代码时,using
非常烦人,特别是当我想要学习某些东西时,因为我无法确定它是该命名空间的一部分还是另一个命名空间的。就像这些明智的人所说的那样,它确实违背了命名空间的初衷,不是吗?重点是保持每个部分的独立性并赋予数据和逻辑含义。
一个好的顺序要记住:最重要的人是使用程序的客户端;第二重要的是维护或试图从你的代码中学习的其他程序员;最不重要的是你自己。 :-)
当命名空间是std时,推荐写出完全限定名称,其中std::只增加了5个额外字符。但当命名空间堆叠时,你面临着编写以下类似代码的问题:
if (NumberOfInstances > 0 && (code_type == MyNamespace::MyLongButMeaningfulClassName::EnumDefinedWithinClass::CODE_GREEN ||
code_type == MyNamespace::MyLongButMeaningfulClassName::EnumDefinedWithinClass::CODE_YELLOW)) {
随你喜欢。实际上,这并不重要。 然而,大多数代码片段使用
using namespace std;