一箇中大型軟件每每由多名程序員共同開發,會使用大量的變量和函數,當有兩我的都同時定義了一個名字相同的全局變量或函數的時候,如果把他們的代碼整合在一塊編譯,此時編譯器就會提示變量或函數重複定義,C++爲了解決這個問題,便引用了命名空間(namespace)的概念。ios
namespace 是C++中的關鍵字,用來定義一個命名空間,語法格式爲:程序員
namespace name{ //variables, functions, classes }
name
是命名空間的名字,它裏面能夠包含變量、函數、類、typedef、#define 等,最後由{ }
包圍。函數
注意:也能夠不用寫name,若定義了一個沒有名字的命名空間,則其內部的代碼只能在這個文件裏面用。spa
namespace { int myAge = 0; }
若要使用命名空間中定義的變量或函數,須要指名它們所在的命名空間,如:code
#include <stdio.h> #include <iostream> using namespace std; namespace DJ{ int myAge = 0; } int main() { DJ::myAge = 5; cout << "my age is: "<< DJ::myAge << endl; return 0; }
::
是一個新符號,稱爲域解析操做符,在C++中用來指明要使用的命名空間。blog
還能夠這樣寫(直接使用using聲明):開發
#include <stdio.h> #include <iostream> using namespace std; namespace DJ{ int myAge = 0; } int main() { using DJ::myAge; myAge = 5; cout << "my age is: "<< myAge << endl; return 0; }
在代碼的開頭使用using聲明DJ:myAge,這樣若是接下來的代碼中出現了未指明命名空間的myAge,就使用DJ:myAge,不過要使用別的命名空間中定義的myAge,則仍然須要顯示聲明。編譯器
還能夠寫成這樣:io
#include <stdio.h> #include <iostream> using namespace std; namespace DJ{ int myAge = 0; } int main() { using namespace DJ; myAge = 5; cout << "my age is: "<< myAge << endl; return 0; }
若是命名空間 DJ中定義的其餘的變量,樣具備 myAge變量的效果。編譯
命名空間內部不只能夠聲明或定義變量,對於其它能在命名空間之外聲明或定義的名稱,一樣也都能在命名空間內部進行聲明或定義,例如類、函數、typedef、#define 等均可以出如今命名空間中。
新建一個純C++項目(QT)時,QT默認新建的main.cpp文件以下:
#include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; return 0; }
實際上是省略了cout的命名空間,也能夠寫成這樣:
#include <iostream> int main() { std::cout << "Hello World!" << std::endl; return 0; }