namespace

用來組織和重用代碼

namespace即“命名空間”,也稱“名稱空間”。VS.NET中的各種語言使用的一種代碼組織的形式通過名稱空間來分類,區別不同的代碼功能同時也是VS.NET中所有類的完全名稱的一部分。

解析


命名空間是用來組織和重用代碼的。如同名字一樣的意思,NameSpace(名字空間),之所以出來這樣一個東西,是因為人類可用的單詞數太少,並且不同的人寫的程序不可能所有的變數都沒有重名現象,對於庫來說,這個問題尤其嚴重,如果兩個人寫的庫文件中出現同名的變數或函數(不可避免),使用起來就有問題了。為了解決這個問題,引入了名字空間這個概念,通過使用namespace xxx;你所使用的庫函數或變數就是在該名字空間中定義的,這樣一來就不會引起不必要的衝突了。
通常來說,命名空間是唯一識別的一套名字,這樣當對象來自不同的地方但是名字相同的時候就不會含糊不清了。使用擴展標記語言的時候,XML的命名空間是所有元素類別和屬性的集合。元素類別和屬性的名字是可以通過唯一XML命名空間來唯一。
在XML里,任何元素類別或者屬性因此分為兩部分名字,一個是命名空間里的名字另一個是它的本地名。在XML里,命名空間通常是一個統一資源識別符(URI)的名字。而URI只當名字用。主要目的是為了避免名字的衝突。

範圍


共享相同的命名空間
共享相同的命名空間
所謂namespace,是指標識符的各種可見範圍。C++標準程序庫中的所有標識符都被定義於一個名為std的namespace中。
一:<iostream>和格式不一樣,前者沒有後綴,實際上,在你的編譯器include文件夾裡面可以看到,二者是兩個文件,打開文件就會發現,裡面的代碼是不一樣的。後綴為.h的頭文件c++標準已經明確提出不支持了,早些的實現將標準庫功能定義在全局空間里,聲明在帶.h後綴的頭文件里,c++標準為了和C區別開,也為了正確使用命名空間,規定頭文件不使用後綴.h。因此,當使用時,相當於在c中調用庫函數,使用的是全局命名空間,也就是早期的c++實現;當使用的時候,該頭文件沒有定義全局命名空間,必須使用namespace std;這樣才能正確使用cout
二:由於namespace的概念,使用C++標準程序庫的任何標識符時,可以有三種選擇:
1、直接指定標識符。例如std::ostream而不是ostream。完整語句如下:std::cout<
2、使用using關鍵字。using std::cout;using std::endl;using std::cin; 以上程序可以寫成cout<
3、最方便的就是使用using namespace std;例如:using namespace std;這樣命名空間std內定義的所有標識符都有效(曝光)。就好像它們被聲明為全局變數一樣。那麼以上語句可以如下寫:cout<等等這樣的頭文件,一個是為了兼容以前的C++代碼,一個是為了支持新的標準。命名空間std封裝的是標準程序庫的名稱,標準程序庫為了和以前的頭文件區別,一般不加".h"

舉例


98年以後的c++語言提供一個全局的命名空間namespace,可以避免導致全局命名衝突問題。舉一個實例,請注意以下兩個頭文件:
// one.h
char func(char);
class String { ... };
// somelib.h
class String { ... };
如果按照上述方式定義,那麼這兩個頭文件不可能包含在同一個程序中,因為String類會發生衝突。
所謂命名空間,是一種將程序庫名稱封裝起來的方法,它就像在各個程序庫中立起一道道圍牆。
在這裡繼續演示一個完整的命名空間事例:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//DISPLAYNamespaceDemonstration
#include 
using namespace std ;
namespace savitch1 
{
void greeting();
}
namespace savitch2 
{
void greeting();
}
void big_greeting();
int main()
{
{
using namespace savitch2 ;
//使用savictch2、std、全局三個命名空間
greeting();
}
{
using namespace savitch1 ;
//使用savitch1、std、全局三個命名空間
greeting();
}
big_greeting();
//使用了std和全局兩個命名空間
return0 ;
}
namespace savitch1 
{
void greeting()
{
cout<<"Hellofromnamespacesavitch1.\n" ;
}
}
namespace savitch2 
{
void greeting()
{
cout<<"Greetingsfromnamespacesavitch2.\n" ;
}
}
void big_greeting()
{
cout<<"ABigGlobalHello!\n" ;
}

命名空間


在struts2中

在struts2里,namespace是package里的一個屬性,用來標記action的訪問路徑。注意:只有package的namespace才能標記路徑而不是name屬性。在struts2里,存在著一個是默認namespace-"",若package不指定namespace,則package里的action就使用默認namespace。若訪問action時沒有指定namespace則struts2會先在根namespace-"/"里查找action,找不到再到默認namespace里查找action。再找不到就會報錯,也就是說struts2隻會查找兩層namespace。

在XML中

命名空間提供避免元素命名衝突的方法。
命名衝突
在 XML(標準通用標記語言下的一個子集)中,元素名稱是由開發者定義的,當兩個不同的文檔使用相同的元素名時,就會發生命名衝突。
這個 XML 文檔攜帶著某個表格中的信息:
ApplesBananas
這個 XML 文檔攜帶有關桌子的信息(一件傢具):
African Coffee Table
80
120
假如這兩個 XML 文檔被一起使用,由於兩個文檔都包含帶有不同內容和定義的 
 元素,就會發生命名衝突。
XML解析器無法確定如何處理這類衝突。
使用前綴來避免命名衝突
此文檔帶有某個表格中的信息:
Apples
Bananas
此XML文檔攜帶著有關一件傢具的信息:
African Coffee Table
80
120
現命名衝突已經不存在了,這是由於兩個文檔都使用了不同的名稱來命名它們的 
 元素 ( 和 )。
通過使用前綴,我們創建了兩種不同類型的 
 元素。
使用命名空間(Namespaces)
這個XML文檔攜帶著某個表格中的信息:
Apples
Bananas
此XML文檔攜帶著有關一件傢具的信息:
African Coffee Table
80
120
與僅僅使用前綴不同,我們為 
 標籤添加了一個 xmlns 屬性,這樣就為前綴賦予了一個與某個命名空間相關聯的限定名稱。
XML Namespace (xmlns)屬性
XML命名空間屬性被放置於元素的開始標籤之中,並使用以下的語法:
xmlns:namespace-prefix="namespaceURI"
當命名空間被定義在元素的開始標籤中時,所有帶有相同前綴的子元素都會與同一個命名空間相關聯。
註釋:用於標示命名空間的地址不會被解析器用於查找信息。其惟一的作用是賦予命名空間一個惟一的名稱。不過,很多公司常常會作為指針來使用命名空間指向實際存在的網頁,這個網頁包含關於命名空間的信息。
統一資源標識符(URI)
統一資源標識符是一串可以標識網際網路資源的字元。最常用的 URI 是用來標示網際網路域名地址的統一資源定位器(URL)。另一個不那麼常用的 URI 是統一資源命名(URN)。在我們的例子中,我們僅使用 URL。
默認的命名空間(Default Namespaces)
為元素定義默認的命名空間可以讓我們省去在所有的子元素中使用前綴的工作。
請使用下面的語法:
xmlns="namespaceURI"
這個 XML 文檔攜帶著某個表格中的信息:
ApplesBananas
  • 目錄