为什么我应该在使用命名空间std之后包含头文件<iostream>?

Man*_*waj 6 c++ iostream std header-files

由于空间std已经拥有了C++包含函数定义(如果我是正确的)库,那么为什么我们包括在它上面的头文件??.由于命名空间std包含c ++标准库,因此我没有理由单独包含它的声明.

Bil*_*nch 8

执行#include <iostream>此操作会导致源文件中包含一组类和其他内容.对于iostream和大多数标准库头文件,它们将这些内容放在名为的命名空间中std.

所以代码#include <iostream>看起来像这样:

namespace std { 
    class cin  { ... };
    class cout { ... };
    class cerr { ... };
    class clog { ... };
    ...
}
Run Code Online (Sandbox Code Playgroud)

所以在这一点上,你可以写一个看起来像这样的程序:

#include <iostream>

int main() {
    std::cout << "hello\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,有些人觉得这std::cout太冗长了.所以他们这样做:

#include <iostream>
using namespace std;

int main() {
    cout << "hello\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,我建议不要这样做,如果你真的觉得这std::cout太冗长了,那么我建议你用一个较小的using陈述.

#include <iostream>
using std::cout;

int main() {
    cout << "hello\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果您想知道为什么我会推荐反对using namespace std,那么我会转发给stackoverflow上的以下两个其他帖子:


Mat*_*son 5

编译器本身没有任何命名空间中的东西的定义(无论是它std还是其他命名空间).这是源文件和头文件的作用.

什么using namespace std;告诉编译器是"如果你不能找到在当前名字空间的一些名字,去看看在std命名空间中一样."

什么#include <iostream>告诉编译器是你要称为标题的内容iostream将包含在你的源代码.这将为编译器提供要执行的代码cin,cout以及许多其他相关功能.该文件的内容声明为namespace std { ... all the stuff goes here ... }.

命名空间的使用允许其他人工作namespace math;而不必担心"嗯,我现在该做什么,我需要一个入口数量的计数器,让我们称之为cin- 但坚持下去,是否曾经在任何地方使用过?".

这可能不是最好的例子,但在大型项目中,跟踪事物和他们拥有的名称变得越来越难.和C++是面向数百万行代码的大型项目一门语言 - 而现在它开始变得越来越难以记住,如果你已经使用了某个名字,要么没有.命名空间确保您不必在特定命名空间之外担心它.

(哦,在我的代码中,我倾向于不使用using namespace std;,但是写std::cout << "Hello, World!" << std::endl;- 这有助于明确cout我在这里使用的是那个std,而不是别的.当你有几个类似的命名空间时,这特别有用事情,比如在我自己的编译器中,我的编译器具有它的功能,std命名空间提供一些东西,以及llvm编译器的东西 - 如果我坚持using namespace llvm;在代码的开头,那么很难跟踪是否Type* p = ...来自LLVM或我自己代码的一部分.)