2010-04-15 91 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可能會在全局之前搜索),但你應該避免編寫依賴於它的代碼。