有關(guān)C++命名空間的概念,已經(jīng)寫(xiě)過(guò)一篇了,但是這一塊感覺(jué)有很多可以說(shuō)的東西,想起啥就說(shuō)點(diǎn)啥吧,昨天我們說(shuō)的那篇文章的開(kāi)頭就說(shuō)了using namespace std
的例子,為什么寫(xiě)了這個(gè)語(yǔ)句之后,我們寫(xiě)cout等東西就不需要寫(xiě)命名空間的作用范圍了,比如std::cout
變成cout
,是因?yàn)楫?dāng)我們使用using聲明的時(shí)候,相當(dāng)于說(shuō)告訴當(dāng)前的cpp文件,接下來(lái)的作用域范圍內(nèi),std這個(gè)namespace已經(jīng)屬于你了,而我們會(huì)遇到比較長(zhǎng)的namespace的名字,比如昨天的:
namespace namespace_1 {
void func() {
std::cout << "namespace_1" << std::endl;
}
}
這種情況下,我們?yōu)榱送祽?#xff0c;可以直接在main函數(shù)里面寫(xiě)上我們將要用的namespace的名字,比如:
using namespace namespace_1;
int main(){
func();//call namespace_1::func()
//namespace_2::func();
//func();// func is undefined
}
這當(dāng)然是沒(méi)什么問(wèn)題,但是接下來(lái)如果我們是把namespace_2也如此聲明,并且兩者里面都定義了名叫func的函數(shù),那么會(huì)怎樣呢?
using namespace namespace_1;
using namespace namespace_2;
int main(){
func();//call namespace_1::func()
//func();// func is undefined
}
我們可以看到這里產(chǎn)生了二義性,編譯器不知道該去調(diào)用哪一個(gè)func了
這種情況下我們應(yīng)該怎么辦呢,我們可以考慮使用using來(lái)指定我們需要使用的操作:
using namespace namespace_1;
using namespace namespace_2;
int main(){
using namespace_2::func;
func();//call namespace_2::func()
//func();// func is undefined
}
這種using的用法就是告訴編譯器,下面用到的func都來(lái)自我的namespace_1的命名空間。我一般是不會(huì)去這樣操作的,我會(huì)直接使用namespace本身的名字去指定想要調(diào)用的函數(shù),這樣也增加了別人讀你代碼的可讀性,這里只是分享一下可以使用的處理辦法。
內(nèi)聯(lián)命名空間
內(nèi)聯(lián)命名空間這個(gè)東西是C++11的新標(biāo)準(zhǔn),屬于嵌套命名空間,可以直接使用外層的命名空間進(jìn)行訪問(wèn)內(nèi)部的成員或者function,還是舉個(gè)例子來(lái)看:
/*test_namespace_1.hpp*/
#pragma once
#include<iostream>
namespace namespace_1 {
inline namespace ns_1 {
void func_inline() {
std::cout << "ns_1" << std::endl;
}
}
namespace ns_2 {
void func() {
std::cout << "ns_2" << std::endl;
}
}
}
我們可以看到在這個(gè)hpp中,我將ns_1最前面加了inline
關(guān)鍵字,這就是告訴編譯器,我這個(gè)命名空間是內(nèi)聯(lián)的,而下面的ns_2就沒(méi)有這個(gè)關(guān)鍵字,我們來(lái)看一下main函數(shù)的調(diào)用情況:
int main(){
namespace_1::func_inline();
namespace_1::ns_2::func();
namespace_1::func();//namespace_1 has no member func()
//func();// func is undefined
}
直接調(diào)用namespace_1下的func_inline是沒(méi)問(wèn)題的,因?yàn)檫@是內(nèi)聯(lián)中一個(gè)成員函數(shù),但是如果直接調(diào)用func那就是會(huì)報(bào)錯(cuò)了。
時(shí)間不早了,今天先寫(xiě)這些吧,改日再寫(xiě)。
“Fear doesn’t need conquering. Fear tells you where the edge is.”