C 命名空間

2021-08-20 22:40:16 字數 3042 閱讀 4357

命名空間是為了防止名字衝突提供了更加可控的機制。命名空間分割了全域性命名空間,其中每個命名空間是乙個作用域。通過在某個命名空間中定義庫的名字,庫的作者(以及使用者)可以避免全域性名字固有的限制。

命名空間由關鍵字 namespace 命名空間的名字(可以匿名後面講)和由花括號括起來的生命和定義組成。

命名空間可以放 類、變數(及其初始化)、函式(及其定義)、模板和其他命名空間。

命名空間不能定義在函式或類的內部

namespace

waorange

};void func();

void func1()

namespace

other

}

命名空間可以是不連續的

命名空間可以定義在幾個不同的部分 例如我想去給上面的命名空間新增一部分內容:

namespace

waorange

};}

1.使用完全限定名:

waorange::

a test;

test.dosomething();

waorange::

a = 10

;

2.使用 using 宣告, 以將乙個識別符號引入範圍:

using waorange::a;

a test;

test.dosomething();

3.使用 using 指令,以將命名空間中的所有內容引入範圍:

using namespace

waorange;

a test;

test.dosomething();

a = 10;

全域性作用域中定義的名字就是定義在全域性空間中。全域性命名空間以隱式的方式宣告,並且在所有程式中都存在。全域性作用域中定義的名字被隱式的新增到全域性命名空間中。

作用域運算子同樣可以用於全域性作用域的成員,因為全域性作用域是隱式的,所以沒有名字。下面的形式

::member_name

表示全域性命名空間中的乙個成員

可以巢狀命名空間。 巢狀命名空間具有對其父級成員的非限定訪問許可權,而父成員不具有對巢狀命名空間的非限定訪問許可權,如下面的示例所示:

namespace

nestnamespace

}}

在外面訪問內部巢狀的命名空間 nestnamespace::nest::test();

命名空間可以起別名

namespace

alias = waorange;

alias::func1();

namespace

another_name = alias;

another_name::func1();

namespace

another_name2 = waorange;

another_name2::func1();

可以起多個別名

namespace  

}

這稱為未命名的命名空間或匿名命名空間,在你想要使變數宣告對於其他檔案中的**不可見(即 為它們提供內部鏈結),而不必建立已命名的命名空間時非常有用。 同一檔案中的所有**都可以看到未命名的命名空間中的識別符號,但這些識別符號以及命名空間本身在該檔案外部不可見。

以下**

與普通巢狀命名空間不同,內聯命名空間的成員會被視為父命名空間的成員。 這一特性使針對過載函式的依賴於引數的查詢可以對父命名空間和巢狀內聯命名空間中具有過載的函式起作用。 它還可讓你在內聯命名空間中宣告的模板的父命名空間中宣告專用化。 下面的示例演示在預設情況下,外部**如何繫結到內聯命名空間:

#include

namespace test

} inline

namespace new_ns

} } #include "header.h"

#include

#include

int main()

下面的示例演示如何在內聯命名空間中宣告的模板的父命名空間中宣告專用化:

namespace parent  

; }

template

<>

class c {};

}

可以將內聯命名空間用作版本控制機制,以管理對庫的公共介面的更改。 例如,可以建立單個父命名空間,並將介面的每個版本封裝到巢狀在父命名空間內的其自己的命名空間中。 保留最新或首選的版本的命名空間限定為內聯,並因此以父命名空間的直接成員的形式公開。 呼叫 parent::class 的客戶端**將自動繫結到新**。 通過使用指向包含該**的巢狀命名空間的完全限定路徑,選擇使用較舊版本的客戶端仍可以對其進行訪問。

inline 關鍵字必須應用到編譯單元中命名空間的第乙個宣告中。

下面的示例演示乙個介面的兩個版本,每個版本位於乙個巢狀命名空間中。 通過 v_10 介面對 v_20 命名空間進行了某些修改,且該命名空間被標記為內聯。 使用新庫並呼叫 contoso::funcs::add 的客戶端**將呼叫 v_20 版本。 嘗試呼叫 contoso::funcs::divide 的**現在將獲取乙個編譯時錯誤。 如果它們確實需要該函式,則仍可以通過顯式呼叫 contoso::v_10::funcs::divide 訪問 v_10 版本。

namespace contoso  

; }

inline

namespace v_20

; }

}

參考:

stanley b. lippman 《c++ primer(中文版)(第5版)》

spring p命名空間 c命名空間

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

C 命名空間 預設命名空間與匿名命名空間

2.匿名命名空間 預設命名空間也叫全域性命名空間,所有沒有置於某一具體命名空間下的 即在預設命名空間下,例如func main 函式。include void func void intmain int argc,char ar void func void 需要注意的是 這個就是類似於c語言裡簡單...

C 命名空間,也有叫命名空間

在c 中,名稱 name 可以是符號常量 變數 巨集 函式 結構 列舉 類和物件等等。為了避免在大規模程式設計中,以及在程式設計師使用各種各樣的c 庫時,這些識別符號的命名發生衝突,標準c 引入了關鍵字namespace 命名空間 名字空間 命名空間 名域 可以更好地控制識別符號的作用域。std是c...