2011-02-24 75 views
17

在C++中,#include指令和using namespace之間有什麼區別?你也將你的名字空間存儲爲單獨的文件,這些文件的文件擴展名是什麼?C++:using namespace and #include

+0

C中沒有名稱空間,只改爲C++。 – 2011-02-25 17:37:43

回答

22

爲了回答你的問題,我會稍微回過頭來看看C和C++的一些基礎知識。

編譯C/C++時,將源文件編譯成實際的可執行文件實際上是兩個步驟,即編譯和鏈接。編譯步驟一次只接受一個.cpp文件並編譯。其他.cpp文件的內容對編譯器不可見。這會生成一個「目標文件」(我不知道爲什麼這樣稱呼它)。所有的目標文件然後通過鏈接器鏈接以產生最終的可執行文件。

這帶來了C++中兩個重要的概念,聲明和定義。聲明指定某處(變量或函數)將存在於某處。以下是函數foo()的聲明

void Foo(); 

這意味着我們已經告訴編譯器的地方會有一個函數foo(),它沒有參數,沒有返回值。

定義指定了函數的實際功能。這裏定義函數

void Foo() { cout << "Foo!!"; } 

讓我們定義另一個函數,酒吧()

void Bar() { 
    Foo(); 
    cout << "bar"; 
} 

此函數調用函數foo()。如果函數foo尚未在同一個文件中聲明或定義,則無法編譯此函數。所以聲明本身不會產生任何編譯代碼。他們必須在那裏。

如果函數Foo()沒有在這個文件中定義,而是一個不同的.cpp文件,那麼鏈接器的工作就是在這兩個函數之間建立連接。如果函數Foo()沒有在任何地方定義,你將會得到一個鏈接器錯誤,而不是編譯器錯誤。

這涉及頭文件的概念。頭文件是您存儲聲明的地方。當使用#include包含頭文件的內容時,實際發生的情況是預處理器(在實際編譯器之前執行的一個步驟)將加載包含的文件並將內容「粘貼」到原始源文件中。所以編譯器會看到文件,就好像整個頭文件實際上被粘貼到C++文件中一樣。

所以,當你在C++編程,你通常會放在.cpp文件的定義,你就會把你的聲明.h文件中,另一方面

命名空間是一個簡單的方法進行邏輯分組代碼。

因此,不,名稱空間不存儲在單獨的文件中,並且它們沒有特定的文件擴展名。如果我有一個具有多個名稱空間的項目,我可能會爲每個名稱空間創建一個單獨的目錄(然後再次,我可能不會,這取決於情況)。

34

在C++中,#include用於將文件添加到您的項目,而namespace是用來保持在邏輯模塊的對象(命名空間並不適用於C)

例如,你可能在文件中的向量類「vector.h」,所以你把它包含在你的項目中。

向量是一個大型圖書館(標準庫)STD的一部分,這樣你就可以

std::vector 

但是由於程序員的懶惰,不想寫的std ::遍佈訪問(標準庫有許多非常有用的部分),您可以在文件頂部寫上

using namespace std 

。這將告訴編譯器,每次它看到一個類型(比如向量)時,還要檢查命名空間std,因爲定義可能在那裏。這樣,以下聲明就變得相當了。

std::vector 
vector 

在vector.h,你應該看到類似

namespace std 
{ 
    class vector { /* Implementation */ } 
} 

所以#include是添加文件,而using namespace是讓你的代碼更清潔和包裝「有意義」的圖書館。編程時你可以省略using namespace,但絕對需要#include

相關問題