C++系列: 巢狀名稱空間

無.處安放的靈魂發表於2021-01-03

目錄

1.什麼是巢狀名稱空間?

2.實驗

2.1 外部引用巢狀名稱空間內的符號

2.2 名稱空間內容不同層次間符號的引用

3.最後


 

1.什麼是巢狀名稱空間?

巢狀名稱空間就是在名稱空間裡面在定義其它的名稱空間,就像是俄羅斯套娃。

namespace np1
{
    namespace np2
    {
        namespace np3
        {

        }
    }
    ...
}

2.實驗

2.1 外部引用巢狀名稱空間內的符號

情況一

#include <iostream>

using namespace std;

namespace np1
{
	namespace np2
	{
		void func2()
		{
			cout << "np1::np2::func2" << endl;
		}
	}
	
	void func1()
	{
		cout << "np1::func1" << endl;
	}
	
}

int main()
{
	np1::func1();
	np1::np2::func2();
	return 0;
}

實驗結果

表明巢狀名稱空間的引用是符合namespace語法的,沒有特殊之處。

 

情況二

using namespace np1;
int main()
{
	func1();
	np2::func2();
	return 0;
}

輸出結果一樣。

 

2.2 名稱空間內容不同層次間符號的引用

情況一:第一層呼叫第二層

#include <iostream>

using namespace std;

namespace np1
{
	namespace np2
	{
		void func2()
		{
			cout << "np1::np2::func2" << endl;
		}
	}
	
	void func1()
	{
		np2::func2();
	}
	
}


int main()
{
	np1::func1();

	return 0;
}

實驗結果

表明在名稱空間內部的不同層次符號引用依然遵循namespace語法。

 

情況二:第二層呼叫第一層

#include <iostream>

using namespace std;

namespace np1
{
	void func1()
	{
		cout << "np1::func1" << endl;
	}
	
	namespace np2
	{
		void func2()
		{
			func1();
            //np1::func1();
		}
	}
}


int main()
{
	np1::np2::func2();

	return 0;
}

實驗結果

表明np1相對於np2來說,是預設名稱空間或者是全域性名稱空間。

 

情況三:第二層呼叫第一層,但是第一層和第二層存在相同的符號

#include <iostream>

using namespace std;

namespace np1
{
	void func1()
	{
		cout << "np1::func1" << endl;
	}
	
	namespace np2
	{
		void func1()
		{
			cout << "np1::np2::func1" << endl;
		}
		void func2()
		{
			func1();
		}
	}
}


int main()
{
	np1::np2::func2();

	return 0;
}

實驗結果

表明np2優先會呼叫自己內部的符號。正如一個函式的內部,它會優先呼叫自己的區域性變數,接著才考慮尋找全域性變數。

 

3.最後

一定要記住,namespace本質是用來解決命名衝突的問題。

 

 

 

 

相關文章