在C語言中程序的全局變量作用域只有一個,所有的全局標識符都共享同一個作用域,在多人開發的時候,容易造成標識符沖突。C++為了解決這個問題提出了命名空間這一概念,通過命名空間把全局變量作用域劃分為不同的部分,不同的命名空間中的可以相同但不產生沖突。
Tips: 標識符:標識符是指常量、 變量、語句標號,用戶自定義函數的名稱,用戶類型等等
namespace name
{
//自定義的標識符
}
Tips: 1.在全局作用域也叫默認命名空間,在全局作用域定義的自定義標識符都屬於默認命名空間
2.命名空間可以嵌套定義
例
namespace First { int i = 0; } namespace Second { int i = 1; int j = 2; namespace Internal { struct Stu { char name[30]; unsigned int number; }; } }
定義了命名空間後,接下來就要使用命名空間了。由於“全局作用域”通過命名空間被劃分為了多個小的全局作用域。因此,使用命名空間中的成員需要先確定成員屬於哪一個命名空間。
命名空間名::[命名空間名::……]成員名;
1.引入命名空間中所用的成員:using namespace 命名空間名[::命名空間名…];
2.引入命名空間中的單一成員:using 命名空間名::[命名空間名::……]成員名;
引入用命名空間的成員之後,就可以直接使用命名空間中的成員的。這就遇到一個問題,當引入成員名稱與局部成員 名稱同名時,會是誰覆蓋誰,還是報錯?編譯器兩者方式都會采取。
1.當引入命名空間中所用的成員時,局部成員覆蓋命名空間中的成員。
2.當引入命名空間中的單一成員時,編譯器報錯。
例:
#include <stdio.h> namespace First { int i = 0; } namespace Second { int i = 1; int j = 2; namespace Internal { struct Stu { char name[30]; unsigned int number; }; } } int main(void) { using namespace First; //引入所有成員 using Second::Internal::Stu; //引入單一成員 printf("i = %d\n", i); //引入後直接使用 printf("i = %d\n", Second::i); //直接使用 Stu stu1 = {"Jude", 1}; //引入後直接使用 printf("stu1.name = %s\n", stu1.name); printf("stu1.number = %d\n", stu1.number); /**************命名空間的成員與局部變量成員的沖突測試*****************/ int i; //沒問題 using Second::j; int j; //報錯 return 0; }
上次將引用的時候所,引用是一個變量的別名。命名空間也是可以用別名。
定義別名:
namespace 別名 = 命名空間名