【C++】命名空間(namespace)詳解


 一、為什么使用命名空間

考慮一種情況,當我們有兩個同名的人,Zara,在同一個班里。當我們需要對它們進行區分我們必須使用一些額外的信息和它們的名字,比如這個區域,如果它們生活在不同的區域或者它們的母親或父親的名字,等等。

  在您的C++應用程序中也會出現同樣的情況。例如,您可能正在編寫一些具有名為xyz()函數的代碼,並且還有另一個可用的庫,它也具有相同的xyz()函數。現在編譯器無法知道您在代碼中引用的xyz()函數的哪個版本。

  名稱空間(namespace)被設計來克服這個困難,並被用作額外的信息來區分類似的函數、類、變量等等,它們在不同的庫中具有相同的名稱。使用名稱空間,您可以定義定義名稱的上下文。本質上,名稱空間定義了一個范圍。

二、命名空間的定義

在C語言中只有一個全局作用域:

1.C語言中所有的全局標識符共享一個作用域
2.標識符之間可能發生沖突

C++中提出了命名空間的概念:

1.命名空間將全局作用域分成不同的部分,
2.不同命名空間中的標識符可以同名而不會發生沖突
3.命名空間可以發生嵌套
4.全局作用域也叫默認命名空間

語法:

namespace Name
{
	namespace Internal
	{
		/*...*/
	}
	/*...*/
}

C++命名空間的使用:

使用整個命名空間:using namespace name;
使用命名空間中的變量:using name::variable
使用默認命名空間中的變量:  ::variable

Example:

#include <stdio.h>
#include <iostream>
namespace First 
{
	int i = 0;
}

namespace Second
{
	int i = 1;

	namespace Internal //嵌套命名空間
	{
		struct P  //嵌套命名空間
		{
			int x;
			int y;
		};
	}
}

int main()
{
	using namespace First; //使用整個命名空間
	using Second::Internal::P;  //使用嵌套的命名空間

	printf("First::i = %d\n", i);
	printf("Second::i = %d\n", Second::i);  //使用命名空間中的變量

	P p = { 2, 3 };

	printf("p.x = %d\n", p.x);
	printf("p.y = %d\n", p.y);

	system("pause");
	return 0;
}

編譯運行,輸出結果:

 三、using指令

  可以使用using namespace指令避免使用名稱空間前置。該指令告訴編譯器后續代碼正在使用指定命名空間中的名稱。

Example:

#include <iostream>
using namespace std;

// first name space
namespace first_space {
   void func() {
      cout << "Inside first_space" << endl;
   }
}

// second name space
namespace second_space {
   void func() {
      cout << "Inside second_space" << endl;
   }
}

using namespace first_space;
int main () {
   // This calls function from first name space.
   func();
   
   return 0;
}

編譯運行,輸出結果:

四、std命名空間

  下列代碼可以引用cout而不預先添加命名空間:

#include <iostream>
using std::cout;

int main () {
   cout << "std::endl is used with std!" << std::endl;
   
   return 0;
}

編譯運行,輸出結果:

<本文完>

參考資料:

1)唐佐林《C++深度解析教程》

2) tutorialspoint


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM