命名空間namespace:指標識符的各種可見范圍。
C++標准程序庫中的所有標識符都被定義在一個std的namespace,這就是程序開始添加 using namespace std; 的原因。
很多人共同完成一套代碼,不可能不出現標識符命名相同的問題,為了解決沖突問題,產生了命名空間namespace。
命名空間包括又名命名空間和無名命名空間
一、有名命名空間
有名命名空間的定義格式:
namespace 空間名 { code } // 有名命名空間的嵌套定義 namespace 空間名1 { code namespace 空間名2 { code } }
有名命名空間的使用格式:
// 直接使用"::"連接空間名和code 空間名:: code; // code為變量或函數
有名命名空間取別名為了方便使用,定義格式如下:
namespace 別名 = 空間名;
using 指令使用格式:
// 表示后面代碼都使用此命名空間,如果屬空於本空間,無需再使用"::"連接空間名和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; }
執行結果:
二、無名命名空間
命名空間不僅可以避免名稱沖突,還可以是代碼保持局部性,從而保護代碼不被他人非法使用。
在當前的編譯單元直接使用無名命名空間中的成員,但是在當前編譯單元之外,它是不可見的
無名命名空間定義格式:
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; }
執行結果:
總結:
1、命名空間可以嵌套定義,但不能嵌套聲明;
2、可以多次聲明和定義同一命名空間,相當於擴充,並添加新成員;
3、無名命名空間中的成員不能與同一文件中外部的成員相同;
4、無名命名空間中的成員使用方式與全局變量使用方式相同。