命名空間namespace:指標識符的各類可見範圍。ios
C++標準程序庫中的全部標識符都被定義在一個std的namespace,這就是程序開始添加 using namespace std; 的緣由。函數
不少人共同完成一套代碼,不可能不出現標識符命名相同的問題,爲了解決衝突問題,產生了命名空間namespace。spa
命名空間包括又名命名空間和無名命名空間code
1、有名命名空間blog
有名命名空間的定義格式:io
namespace 空間名 { code } // 有名命名空間的嵌套定義 namespace 空間名1 { code namespace 空間名2 { code } }
有名命名空間的使用格式:編譯
// 直接使用"::"鏈接空間名和code 空間名:: code; // code爲變量或函數
有名命名空間取別名爲了方便使用,定義格式以下:class
namespace 別名 = 空間名;
using 指令使用格式:stream
// 表示後面代碼都使用此命名空間,若是屬空於本空間,無需再使用"::"鏈接空間名和code using namespace 空間名; // 空間名支持嵌套 //最經常使用的std空間 using namespace std;
舉例:變量
#include <iostream> // 使用std命名空間下的變量 using namespace std; int a = 5; namespace A { int a = 10; // 命名空間支持嵌套定義 namespace B { int a = 15; int b = 20; } // 命名空間能夠重複定義,至關於擴充 namespace B { int x = 30; int y = 35; } } namespace C { int a = 25; // 錯誤,命名空間不能嵌套聲明 // namespace D; } int main(void) { // 若是不寫using namespace std,就必須加前綴std:: std::cout << "Hello World!" << std::endl; cout << endl; // 換行 cout << "a = " << a << endl; cout << "A::a = " << A::a << endl; cout << "A::B::a = " << A::B::a << endl; cout << "C::a = " << C::a << endl; // 錯誤,提示變量b沒有聲明 // cout << "b = " << b << endl; cout << endl; // 命名空間取別名 namespace AB = A::B; cout << "AB = A::B" << endl; cout << "AB::a = " << AB::a << endl; cout << "AB::b = " << AB::b << endl; cout << endl; // 後面的代碼使用A::B命名空間下的變量 using namespace A::B; cout << "使用A::B命名空間" << endl; cout << "b = " << b << endl; cout << "x = " << x << endl; cout << "y = " << y << endl; return 0; }
執行結果:
2、無名命名空間
命名空間不只能夠避免名稱衝突,還能夠是代碼保持局部性,從而保護代碼不被他人非法使用。
在當前的編譯單元直接使用無名命名空間中的成員,可是在當前編譯單元以外,它是不可見的
無名命名空間定義格式:
namespace { code }
舉例:
#include <iostream> // 使用std命名空間下的變量 using namespace std; // 若是定義與無名命名空間相同,則會產生衝突報錯 //int a = 5; namespace { int a = 10; int b = 20; namespace B { int a = 30; int b = 40; } int add(int a, int b) { return (a + b); } } int main(void) { // 默認使用無名命名空間中的變量和空間 cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "B::a = " << B::a << endl; cout << "B::b = " << B::b << endl; cout << endl; cout << "a + b = " << add(a, b) << endl; cout << "B::a + B::b = " << add(B::a, B::b) << endl; return 0; }
執行結果:
總結:
一、命名空間能夠嵌套定義,但不能嵌套聲明;
二、能夠屢次聲明和定義同一命名空間,至關於擴充,並添加新成員;
三、無名命名空間中的成員不能與同一文件中外部的成員相同;
四、無名命名空間中的成員使用方式與全局變量使用方式相同。