為什么要使用命名空間?
一個中大型軟件往往由多名程序員共同開發,會使用大量的變量和函數,不可避免地會出現變量或函數的命名沖突。當所有人的代碼都測試通過,沒有問題時,將它們結合到一起就有可能會出現命名沖突。
為了解決合作開發時的命名沖突問題,C++ 引入了命名空間(Namespace)的概念。
命名空間將全局作用域分成不同的部分不同命名空間中的標識符可以同名而不會發生沖突命名空間可以相互嵌套全局作用域也叫默認命名空間
對于不帶.h的頭文件,所有的符號都位于命名空間 std 中,使用時需要聲明命名空間 std;對于帶.h的頭文件,沒有使用任何命名空間,所有符號都位于全局作用域。這也是 C++ 標準所規定的。
將 std 直接聲明在所有函數外部,這樣雖然使用方便,但在中大型項目開發中是不被推薦的,這樣做增加了命名沖突的風險,我推薦在函數內部聲明 std。
命名空間的使用實例:
#include <iostream>// namespace是一個關鍵字,用來定義命名空間
namespace NameA
{int a;void swap (int* a, int* b){int temp = *a;*a = *b;*b = temp;}namespace NameAA{};struct A{};
};int a;int main2_3()
{// 對命名空間中單個元素使用using NameA::swap;int b = 20;int c = 30;swap (&b, &c);a = 40;return 0;
}void func()
{}// 2、使用 using 關鍵字
int main2_2()
{// 表明使用命名空間NameA中的內容// 但凡在這個聲明之后使用的變量或者函數,只要沒有指明具體的命名空間// 都使用Name A中的內容// using 有效范圍時當前的大括號{ }using namespace NameA;NameA::a = 100;// ::前不加名字,代表使用默認的命名空間::a = 20;func();printf ("a = %d, %d\n", NameA::a, ::a);int b = 10;int c = 20;// swap 沒有指明命名空間// 但是之前有了usingspace NameA; 而NameA中有swapswap (&b, &c);return 0;
}// 命名空間的使用,1、域解析符::
int main2_1()
{a = 10; // 全局的aNameA::a = 20; // 使用命名空間Name A中的變量int b = 1;int c = 2;NameA::swap (&b, &c);printf ("b = %d, c = %d\n", b, c);return 0;}