#include <iostream>
using namespace std;
int main() {
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
return 0;
}
如果我删除第二个语句,则构建将失败。
为什么有必要?
答案 0 :(得分:12)
因为cout
名称空间中包含endl
和std
。
您可以删除using namespace std
行,然后改为std::cout
和std::endl
。
这是一个应该使命名空间清晰的例子:
<强> Stuff.h:强>
namespace Peanuts
{
struct Nut
{
};
}
namespace Hardware
{
struct Nut
{
};
}
当您执行using namespace Hardware
之类的操作时,您可以使用Nut而无需明确指定命名空间。对于使用这些类中的任何一个的任何源,它们需要1)包含头和2)指定类的命名空间或放置using指令。
命名空间的重点是分组,也避免命名空间冲突。
根据您的问题编辑#include:
#include <iostream>
包含cout
和endl
的来源。该源位于名为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本地版本。