C 命名空間介紹

2022-09-21 13:57:10 字數 1552 閱讀 1431

目錄

在c++當中,名稱可以是變數、函式、結構體、列舉、類以及結構體和類的成員。這本身並沒有問題,但隨著專案的增大,名稱之間相互衝突的可能性也會大大增加。

比如我們使用了多個廠商的**,它們都定義了list,tree和node類,但定義的方式不同,也就沒辦法互相相容。這個時候當我們希望使用乙個庫的list類,而使用另外乙個的tree類,就會非常麻煩。這類衝突被稱為命名空間(namespace)問題。

我們先來複習一下幾個術語。

宣告區域:

宣告區域指的是可以在其中進行宣告的區域,比如我們可以在函式外側宣告全域性變數,對於全域性變數,它的宣告區域就是其宣告所在的檔案。對於函式中宣告的變數, 它的宣告區域就是其宣告所在的**塊。

潛在作用域:

潛在作用域的範圍比宣告區域更加精確,它從宣告語句處開始一直到宣告區域的結尾。這是因為變數必須定義之後才能使用,所以潛在作用域的範圍比宣告區域要小。

這裡有乙個細節,變數並不一定在整個潛在作用域都是可見的。因為可能還會被巢狀在宣告區域中的同名變數隱藏。比如說我們同時定義了乙個全域性變數和乙個函式中的同名變數,那麼在函式當中,外側的全域性變數將會被同名的區域性變數隱藏。

作用域:

結合前面所說的,變數對於程式而言可見的範圍被稱為作用域,它又比潛在作用域更加精確一些。

c++新增了通過定義一種新的宣告區域來建立命名的命名空間,這樣做的目的是提供乙個宣告名稱的區域。乙個命名空間中的名稱不會與另外乙個命名空間的相同名稱發生衝突,同時允許程式的其他部分使用該命名空間中宣告的東西。

比如c++ primer當中的這個例子,下面使用新的關鍵字namespace建立了兩個命名空間a和b。

namespace a ;

}namespace b

double fetch;

int pal;

struct hill ;

}命名空間可以是全域性的,也可以位於另外乙個命名空間中,但不能位於**塊中。因此,預設命名空間裡的所有宣告的名稱的鏈結性都是外部的,const關鍵字修飾的常量除外。

除了使用者定義的命名空間之外,還存在另外乙個命名空間——全域性命名空間。它對應於檔案級的宣告區域,因此前面所說的全域性變數現在被描述為位於全域性命名空間中。

任何命名空間中的名稱都不會與其他空間的名稱發生衝突,因此a中的fetch可以和b中的fetch共存。命名空間中的宣告和定義規則桶全域性宣告和定義的規則相同。

命名空間是開放的,可以把名稱加入到已經建立的命名空間中,比如:

namespace a

同樣我們之前在命名空間a當中只是定義了函式fetch,而沒有定義,我們也可以在之後的**當中新增定義:

namespace a

}當然而我們需要一種方法來訪問給定命名空間裡的名稱,最簡單的方法是使用作用域解析符::,使用命名空間名來找到該名稱:

a::pail = 12.34;

a::fetch();

沒有作用域解析符的名稱成為未限定名稱,包含了命名空間的名稱稱為限定的名稱。

這一篇當中涉及了許多概念,看起來有些晦澀。但我個人感覺,這些概念理解起來並不複雜,主要是一些說明性的語言讀起來有些難以理解。最好的辦法就是沉下氣來,一點點精讀程式設計客棧,先把前面理解了再看後面。

schema命名空間介紹

schema是用於描述和規範xml文件的 邏輯結構 的一種語言,它最大的作用就是驗證xml 檔案邏輯結構 的正確性。可以理解成與 dtd 文件型別定義 功能差不多 但是schema在當前的web開發環境下優越很多。因為它本身就是乙個有效的xml文件,因而可以更直觀地了解xml的結構。除此之外,sch...

spring p命名空間 c命名空間

p命名空間 1.需要引入命名空間p 並不真實存在 是在spring內部中實現的 xmlns p 2.如果是引用注入需要加 ref字尾 p和c命名空間 並不適用於集合引數 c命名空間 1.需要引入命名空間c 並不真實存在 是在spring內部中實現的 xmlns c 2.可以使用c 引數名 或c 引數...

C 視窗抖動 執行緒 命名空間介紹

一 執行緒 1.執行緒是指計算機在執行 所讀取 的一種方式,一般都是一行一行閱讀,c 是按分號閱讀,乙個c 檔案中的 事件函式裡面,嚴格按照從上往下的順序執行事件執行速度是非常快,而執行 的這個流程稱之為執行緒目前使用的是單執行緒 2.執行緒所在地 using system.threading 3....