在C++中,#include
指令和using namespace
之間有什麼區別?你也將你的名字空間存儲爲單獨的文件,這些文件的文件擴展名是什麼?C++:using namespace and #include
回答
爲了回答你的問題,我會稍微回過頭來看看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文件中,另一方面
命名空間是一個簡單的方法進行邏輯分組代碼。
因此,不,名稱空間不存儲在單獨的文件中,並且它們沒有特定的文件擴展名。如果我有一個具有多個名稱空間的項目,我可能會爲每個名稱空間創建一個單獨的目錄(然後再次,我可能不會,這取決於情況)。
在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
- 1. prefix namespace variability and xlst
- 2. 「using namespace std;」在任何#include之前?
- 3. namespace error'Not a namespace-name'
- 4. Django NameSpace錯誤
- 5. 「End element'jsonCalendarItems'from namespace''expected。Found names'item'from namespace''
- 6. PHP命名空間:\ My \ Namespace或My \ Namespace?
- 7. 「boolean and include ..」works but but「boolean and unset($ v)」報告PHP語法錯誤?
- 8. 爲什麼我們在使用「using namespace std」時要使用「#include <iostream>」?
- 9. Silverlight XAML namespace scoping
- 10. WPF XAML Namespace import
- 11. SelectSingleNode without namespace
- 12. jaxb unmarshalling with namespace
- 13. Silverlight Usercontrol clr namespace
- 14. WCF:DataContractAttribute和Namespace
- 15. 爲什麼教條2.2使用-namespace-和-use-而沒有任何include或require聲明..?
- 16. 用#include「」替換#include「」
- 17. C#:property/field namespace ambiguities
- 18. Global scope vs global namespace
- 19. CXF getNode with namespace,unmarshaling
- 20. Navigate to Class with namespace
- 21. 「imports namespace」的工作
- 22. Django中的settings namespace
- 23. xforms「instance namespace」問題
- 24. 「using namespace std;」不工作
- 25. Eclipse C++:class,namespace,enumeration not found
- 26. #include
- 27. 編寫「:: namespace :: identifier」和「namespace :: identifier」有什麼區別?
- 28. Get NameSpace我的測試類
- 29. 「using namespace std;」 「#包括<foo>」 之前
- 30. boost.spirit x3 move_to and list ast member
C中沒有名稱空間,只改爲C++。 – 2011-02-25 17:37:43