命名空間(二)

2021-09-01 06:05:33 字數 2777 閱讀 7923

五、無名的命名空間——替代全域性靜態變數/函式

以上介紹的是有名字的命名空間,c++還允許使用沒有名字的命名空間,如在檔案a中宣告了以下的無名命名空間:

//命名空間沒有名字

namespace{

//定 義命名空間成員

void fun( ){

cout<<"ok."《由於命名空間沒有名字,在其他檔案中顯然無法引用,它只在本檔案的作用域內有效。無名命名空間的成員fun函式的作用域為檔案a(確切地說,是從宣告無名命名空間的位置開始到檔案a結束)。在檔案a中使用無名命名空間的成員,不必(也無法)用命名空間名限定。

如果 在檔案a中有以下語句:

fun();

則執行無名命名空間中的成員fun函式,輸出」ok.」。

在本程式中的其他檔案中也無法使用該fun函式,也就是把fun函式的作用域限制在本檔案範圍中。可以聯想到:在c浯言中可以用static宣告乙個函式,其作用也是使該函式的作用域限於本檔案。c++保留了用static宣告函式的用法,同時提供了用無名命名空間來實現這一功能。隨著越來越多的c++ 編譯系統實現了ansi c++建議的命名空間的機制,相信使用無名命名空間成員的方法將會取代以前習慣用的對全域性變數的靜態宣告 。

六、標準命名空間std

為了解決c++標準庫中的識別符號與程式中的全域性識別符號之間以及不同庫中的識別符號之間的同名衝突,應該將不同庫的識別符號在不同的命名空間中定義(或宣告)。標準c++庫的所有的識別符號都是在乙個名為std的命名空間中定義的,或者說標準標頭檔案(如iostream)中函式、類、物件和類模板是在命名空間 std中定義的。std是standard(標準)的縮寫,表示這是存放標準庫的有關內容的命名空間,含義請楚,不必死記。

這樣,在程式中用到c++標準庫時,需要使用std作為限定。如

std::cout<<"ok."《在有的c++書中可以看到這樣的用法。但是在每個cout,cm以及其他在std中定義的識別符號前面都用命名空間std作為限定,顯然是很不方便的。在大多數的c++程式中常用usmgnamespace語句對命名空間std進行宣告,這樣可以不必對每個命名空間成員一進行處理,在檔案的開頭加入以下 using namespace宣告:

using namespace std;

這樣,在std中定義和宣告的所有識別符號在本檔案中都可以作為全域性量來使用。但是應當絕對保證在程式中不出現與命名空間std的成員同名的識別符號,例如在程式中不能再定義乙個名為cout的物件。由於在命名空間std中定義的實體實在太多,有時程式設計人員也弄不請哪些識別符號已在命名空間std中定義過,為減少出錯機會,有的專業人員喜歡用若干個"using命名空間成員」宣告來代替「using namespace命名空間」宣告,如

using std::string;

using std::cout;

using std::cin;

等。為了減少在每乙個程式中都要重複書寫using宣告,程式開發者往往把編寫應用程式時經常會用到的命名空間std成員的using宣告組成乙個標頭檔案,然後在程式中包含此標頭檔案即可。

如果閱讀了多種介紹c++的書,可能會發現有的書的程式中有using namespace語句,有的則沒有。有的讀者會提出:究竟應該有還是應該沒有?應當說:用標準的c++程式設計,是應該對命名空間std的成員進行宣告或限定的(可以採取前面介紹過的任一種方法)。但是目前所用的c++庫大多是幾年前開發的,當時並沒有命名空間,庫中的有關內容也沒有放在std命名空間中,因而在程式中不必對std進行宣告。

七、 使用早期的函式庫

c語言程式中各種功能基本上都是由函式來實現的,在c語言的發展過程中建立了功能豐富的函式庫,c++從c語言繼承了這份寶貴的財富。在c++程式中可以使用c語言的函式庫。

如果要用函式庫中的函式,就必須在程式檔案中包含有關的標頭檔案,在不同的標頭檔案中,包含了不同的函式的宣告。

在c++中使用這些標頭檔案有兩種方法:

1、用c語言的傳統方法

頭檔名包括字尾.h,如stdio.h,math.h等。由於c語言沒有命名空間,標頭檔案並不存放在命名空間中,因此在c++程式檔案中如果用到帶字尾.h的標頭檔案時,不必用命名空間。只需在檔案中包含所用的標頭檔案即可 。如

#include
2、用c++的新方法

c++標準要求系統提供的標頭檔案不包括字尾.h ,例如iostream、string。

為了表示與c 語言的標頭檔案有聯絡又有區別,c++所用的頭檔名是在c語言的相應的頭檔名(但不包括字尾.h)之前加一字母c。 例如,c語言中有關輸入與輸出的頭檔名為stdio.h在c++中相應的頭檔名為cstdio。c語言中的標頭檔案math.h,在c++中相應的頭文什名為cmath。c語言中的標頭檔案 string.h在c++中相應的頭檔名為cstring。

注意在c++中,標頭檔案cstring和標頭檔案string不是同乙個檔案 。前者提供c語言中對字串處理的有關函式(如strcmp,ctrcpy)的宣告,後者提供c++中對字串處理的新功能。

此外,由於這些函式都是在命名空間std中宣告的,因此在程式中要對命名空間std作宣告 。如:

#include

#include

using namespace std;

目前所用的大多數c++編譯系統既保留了c的用法,又提供丁c++的新方法。下面兩種用法等價,可以任選。

c傳統方法

#include#include#include
c++新方法

#include#include#includeusing namespace std;
可以使用傳統的c方法,但應當提倡使用c++的新方法。

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

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

spring p命名空間 c命名空間

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

c 物件導向(二) 命名空間

命名空間,就是把類再歸類。在.net中已經定義了很多類,並存放在命名空間system中,比如以下的命名空間 畫圖的類 system.drawing 文字操作的類 system.io 當然,我們也可以自己定義命名空間,然後將自己寫的類放進去 命名空間的定義 關鍵字namespace 例 定義乙個命名空...