午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

C++命名空間(貳)

 KookNut39 2021-12-15

有關(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.”

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多