为什么在这里需要使用命名空间std?

时间:2010-03-24 16:54:28

标签: c++ syntax

#include <iostream>
using namespace std;

int main() {
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
}

如果我删除第二个语句,则构建将失败。

为什么有必要?

3 个答案:

答案 0 :(得分:12)

因为cout名称空间中包含endlstd

您可以删除using namespace std行,然后改为std::coutstd::endl

这是一个应该使命名空间清晰的例子:

<强> Stuff.h:

namespace Peanuts
{
  struct Nut
  {
  };
}


namespace Hardware
{
  struct Nut
  {
  };
}

当您执行using namespace Hardware之类的操作时,您可以使用Nut而无需明确指定命名空间。对于使用这些类中的任何一个的任何源,它们需要1)包含头和2)指定类的命名空间或放置using指令。

命名空间的重点是分组,也避免命名空间冲突。

根据您的问题编辑#include:

#include <iostream>包含coutendl的来源。该源位于名为std的名称空间内,该名称空间位于iostream中。

答案 1 :(得分:2)

cout是命名空间std的一部分。现在,如果您使用“std :: cout”并删除第二行,那么它将进行编译。

答案 2 :(得分:0)

是cout和cerr在isotream中定义,但是作为std :: cout和std :: cerr

这样做的原因是你可以愉快地使用像min或max这样的常用词而不用担心某些标准库已经起诉它们,只需编写std :: min和std :: max。这与将'afx'放在所有ATL库函数前面的旧方法没有什么不同。

'使用'声明是因为人们抱怨额外打字,所以如果你把'使用std'假设你认为std ::在标准的所有内容之前。
唯一的问题是如果你有一个名为mystuff的库,它也有一个min()或max()。如果使用std :: min()和mystuff :: min()没有问题,但是如果你把'使用std'和'使用mystuff'你回到了'c'中你遇到的同样的问题

PS。作为一项规则,最好将std :: cout放在一起,让人们清楚这是regualr标准版本而不是你创建的cout本地版本。