溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++11內(nèi)聯(lián)命名空間舉例分析

發(fā)布時(shí)間:2021-11-26 13:57:34 來(lái)源:億速云 閱讀:146 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“C++11內(nèi)聯(lián)命名空間舉例分析”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

命名空間簡(jiǎn)介

隨著軟件開(kāi)發(fā)規(guī)模的擴(kuò)大,類名,函數(shù)名重復(fù)的可能性也越來(lái)越大。最樸素的解決辦法就是改名,這種方法在向已經(jīng)存在的類庫(kù)中添加代碼時(shí)問(wèn)題不大,但是如果是將兩個(gè)從未謀面的代碼庫(kù)結(jié)合在一起時(shí)就不再適用了。

C++解決這個(gè)問(wèn)題的辦法就是引入命名空間。假設(shè)有下面兩個(gè)命名空間:

C++11內(nèi)聯(lián)命名空間舉例分析

代碼中分別定義了std_namespace1和lstd_namespace2兩個(gè)命名空間。在兩個(gè)命名空間內(nèi)分別定義了相同名稱的Normal類。這兩個(gè)類的成員函數(shù)是否一樣其實(shí)不重要,這里姑且使用了相同的名稱。

有了命名空間以后,使用【命名空間名稱::類名】的方式,就可以對(duì)這兩個(gè)同名的Normal類加以區(qū)分了。

C++11內(nèi)聯(lián)命名空間舉例分析

如果使用using語(yǔ)句,可以讓某個(gè)命名空間的內(nèi)容釋放出來(lái),就好像它們都存在與外層命名空間一樣。

C++11內(nèi)聯(lián)命名空間舉例分析

這種方法的一個(gè)弊端就是有可能發(fā)生類名重復(fù)的情況,這時(shí)就需要程序員來(lái)小心控制了。

內(nèi)聯(lián)命名空間

C++11中引入了內(nèi)聯(lián)命名空間(inline namespace),它的特點(diǎn)就是不需要使用using語(yǔ)句就可以直接在外層命名空間使用該命名空間內(nèi)部的內(nèi)容,而且無(wú)需使用命名空間前綴。先看代碼:

C++11內(nèi)聯(lián)命名空間舉例分析

內(nèi)聯(lián)命名空間的聲明方法就是在原來(lái)的聲明語(yǔ)法前面增加inline關(guān)鍵字。除此之外上面代碼還有以下特點(diǎn):

  1. 兩處聲明的命名空間同名,它們同屬一個(gè)命名空間。這是C++命名空間從來(lái)就有的特性。

  2. 第一次聲明命名空間時(shí)使用了inline關(guān)鍵字,這叫顯式內(nèi)聯(lián);第二次沒(méi)有使用inline關(guān)鍵字,但是由于第一次已經(jīng)聲明了inline,這里聲明的還是內(nèi)聯(lián)命名空間。這種情況成為隱式內(nèi)聯(lián)。

內(nèi)聯(lián)命名空間聲明之后,就可以在外層命名空間不適用前綴而直接使用它們了。

C++11內(nèi)聯(lián)命名空間舉例分析

上述代碼中test_inline_namespace處在linline_namespace1的外層,所以可以直接使用Inline1和Inline2。test_inline_namespace2處在更外層,這時(shí)也只是需要使用外層命名空間inline_test前綴即可。

看起來(lái)inline_namespace就像不存在一樣。

嚴(yán)肅的問(wèn)題

前面提到內(nèi)聯(lián)命名空間就像不存在一樣,那么就產(chǎn)生了一個(gè)嚴(yán)肅的問(wèn)題:它有什么用?為了回答這個(gè)問(wèn)題,我們舉一個(gè)更加接近實(shí)際開(kāi)發(fā)的例子。假設(shè)有如下類庫(kù)代碼:

C++11內(nèi)聯(lián)命名空間舉例分析

很簡(jiǎn)單的類,當(dāng)然使用這些類的代碼也同樣簡(jiǎn)單:

C++11內(nèi)聯(lián)命名空間舉例分析

到這里為止算是鋪墊,接下來(lái)才是重點(diǎn):假設(shè)我們隊(duì)類庫(kù)進(jìn)行了升級(jí),同時(shí)又希望:

  1. 使用者代碼不受影響,除非使用者自己想改。

  2. 可以自由使用新類庫(kù)的功能

  3. 如果有需要仍然可以使用原來(lái)的類庫(kù)

解決方法當(dāng)然是使用內(nèi)聯(lián)命名空間。首先是對(duì)類庫(kù)進(jìn)行處理:

C++11內(nèi)聯(lián)命名空間舉例分析

代碼中為每個(gè)版本的類庫(kù)定義了命名空間,同時(shí)將最新版本定義為內(nèi)聯(lián)命名空間。有了這樣的準(zhǔn)備之后,使用者代碼可以是下面這樣:

C++11內(nèi)聯(lián)命名空間舉例分析

使用最新類庫(kù)的時(shí)候,就好像沒(méi)有定義過(guò)命名空間一樣;如果實(shí)在是需要原來(lái)的類庫(kù),可以通用版本前綴加類名的方式。

還有一點(diǎn)很重要:由于隱式內(nèi)聯(lián)語(yǔ)法的存在,將來(lái)出現(xiàn)ver3的時(shí)候,只要將唯一的一個(gè)inline關(guān)鍵字移動(dòng)到第一次出現(xiàn)的ver3定義之前就可以了!

“C++11內(nèi)聯(lián)命名空間舉例分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI