2010-04-15 87 views
9

使用命名空间使用cout,我需要指定:包括在C++

#include<iostream> 

using namespace std; 

哪里cout定义?在iostream中,对吗?那么iostream本身就是在名字空间std

这两个陈述关于使用cout是什么意思?

我很困惑,为什么我们需要包括他们两个。

+5

@Neil那么SO的目的是什么?只能通过阅读书籍或搜索互联网来提问无法回答的问题? – 2010-04-15 18:57:00

+1

@尼尔·巴特沃斯:好的!没有更多的愚蠢的问题后,没有阅读一本书的概念。 – Moeb 2010-04-15 18:57:29

+6

@Kevin任何认为他们可以通过在SO上提出问题来学习C++的人都在欺骗自己,浪费我们的时间。 – 2010-04-15 18:59:54

回答

9

iostream是定义cout的文件的名称。 另一方面,std是一个命名空间,与java的包相当(在某种程度上)。

cout是在std命名空间内的iostream文件中定义的一个实例。

在另一个命名空间中可能存在另一个cout实例。所以,以表明您想从std命名空间中的cout情况下,你应该写

std::cout,指示范围。

std::cout<<"Hello world"<<std::endl; 

为了避免std::无处不在,你可以使用using条款。

cout<<"Hello world"<<endl; 

它们是两个不同的东西。一个表示范围,另一个表示实际包含cout

在回答您的评论

试想一下,在iostream的两个实例命名为cout存在,在不同的命名空间

namespace std{ 
    ostream cout; 
} 
namespace other{ 
    float cout;//instance of another type. 
} 

包括<iostream>后,你仍旧需要指定的命名空间。 #include声明不会说“嘿,在std ::中使用cout”。那是什么using是用于指定范围

+1

@Tom:当我已经包含文件('iostream')时,我指定了要使用哪个'cout'的定义。现在编译器知道要使用什么定义。那么,那么问题是什么。我仍然困惑于为什么我需要说它在'std'命名空间中。如果存在一些混淆,本应该是必要的。在这里,没有混淆,因为“cout”只有一个定义。 – Moeb 2010-04-15 19:03:13

+0

请参阅我的更新回答 – Tom 2010-04-15 19:11:53

+0

@cambr:不,您指定了要使用的'cout'的定义。没有理由不能定义'int cout;'之后,虽然这不是一个好主意。可以说,C++标准可能要求名称空间被忽略,如果只有一个命名空间具有给定的符号,但它没有,并且我无法想象使用名称空间的语言。 – 2010-04-15 19:13:13

1

cout逻辑上定义在iostream内。从逻辑上讲,我的意思是它可能实际上在文件iostream中,或者它可能在iostream中包含的某个文件中。无论哪种方式,包括iostream都是获得cout定义的正确方法。

iostream中的所有符号位于命名空间std中。要使用cout符号,您必须告诉编译器如何找到它(即什么名称空间)。您有几个选择:

// explicit 
std::cout << std::endl; 

// import one symbol into your namespace (other symbols must still be explicit) 
using std::cout; 
cout << std::endl; 

// import the entire namespace 
using namespace std; 
cout << endl; 

// shorten the namespace (not that interesting for standard, but can be useful 
// for long namespace names) 
namespace s = std; 
s::cout << s::endl; 
0

#include <iostream>引用定义cout的头文件。如果你打算使用cout,那么你将永远需要包含。

您不需要using namespace std;。这只是允许您使用速记coutendl等,而不是std::coutstd::endl,其中名称空间是显式的。我个人更喜欢不使用using namespace ...,因为它要求我明确地表达我的意思,虽然它无疑更加详细。

+1

妥协是'使用std :: cout;使用std :: endl;',在此之后,您可以无需限定地使用'cout'和'endl',而不需要将整个'std'命名空间带入全局命名空间。 – 2010-04-15 19:11:19

2

如果你的C++实现使用了C风格的头文件(许多人)再有就是包含类似于下面的文件:

#include ... // bunches of other things included 

namespace std { 

... // various things 

extern istream cin; 
extern ostream cout; 
extern ostream cerr; 

... // various other things 

} 

STD是,C++标准说最标准的东西命名空间应这是为了防止过度填充全局名称空间,这可能会导致难以为您自己的类,变量和函数提供名称,这些名称尚未用作标准事件的名称。

按说

using namespace std; 

你告诉你希望它在除全局命名空间命名空间std中搜索查找名称时,编译器。 如果编译器看到源代码行:

return foo(); 

某处using namespace std;线后,它会寻找foo在各种不同的命名空间(类似范围),直到找到符合该行要求的FOO。它以特定的顺序搜索命名空间。首先它在本地作用域(它实际上是一个未命名的命名空间)中查找,然后是下一个最本地作用域,直到一直到结束,直到函数外部,然后在封闭对象的命名事物(在本例中为方法),然后在全局名称(函数,在这种情况下,除非你已经愚蠢和重载(),我忽略),然后在std命名空间,如果你已经使用了using namespace std;行。我可能会有错误的顺序(std可能会在全局之前搜索),但你应该避免编写依赖于它的代码。