c中是沒有命名空間這個概念的,是c++中新引入的乙個東西,為了處理同名的衝突。
其實命名空間就是封裝的乙個概念。把一些變數、函式、類給封裝起來。和類的封裝概念很像,但是比類的封裝要大。
一、**
1. 自定義定義命名空間
格式:namespacename{}
namespace my
此**的目的就是想往命名空間std加入變數i。(雖然很不提倡,但無語法錯誤)
其實c++標準庫也是這麼做的。因為標準庫中乙個命名空間包含的函式或類是很多的,不可能把這些函式、類都寫在乙個cpp檔案中。所以利用不斷往乙個命名空間加入東西來形成完整的標準庫的命名空間。
2. 使用命名空間
前面提到的使用命名空間中東西,的前提是該命名空間的定義已經在本cpp中,如果不存在,需要#include把要使用的命名空間的定義include進來。例如:inlcudeusingnamespace std;
看到這裡引出另乙個問題:
c中的#include和c++中的#includeusing namespace ***的區別?
其實這2個語句都是想要使用***中的東西。c中沒有命名空間這個概念,所以不需要namespace。而c++中,標準庫的函式都是放在某一命名空間中的,所以必須要有using namespace ***;
也就是說iostream中的各種函式都是在std中的,顯然std還包括其他很多東西。
思考:為何c++要把include中的.h給去掉?
因為我們在寫c++程式時,有時會把類的定義寫在.h檔案中,而把類的實現放在cpp檔案中。
class a
;
#include "stdafx.h"
#includeusing namespace std;
#include "t.h"
void a::foo()
int i=2;
using namespace my;
int _tmain(int argc, _tchar* argv)
由於i=2是沒有定義命名空間,屬於global namespace。而using namespace my,所以下面的main是在global namspace中的,所以可以使用globalnamespace,也可以使用my namespace。而由於兩個命名空間都有i,所以系統不知道該呼叫哪個,就會出錯。
5. 無名命名空間
namespace
顯然無法被別的檔案使用。它只是在本檔案中可以被有效使用。注意和globalnamespace的區別。
6. 不要給c++中的標準庫加入任何東西
例如上面的1提到的:
namespacestd
如果這段**被別的程式引用,雖然這段**不會出現編譯、執行錯誤。但是在c++中有可能會出現不明確的行為,有時會出現莫名其妙的東西。所以一定不要加。
7. 巢狀命名空間
namespacensl
namespace ns2 //巢狀的命名空間
} 如果想輸出命名空間nsl中成員的資料,可以採用下面的方法:
cout
C 之命名空間
一 命名空間的定義與簡介 命名空間是ansi c 引入的可以由使用者命名的作用域,用來處理程式中常見的命名衝突。例如有兩個標頭檔案中都定義了student類,那麼在主程式中都包含這兩個標頭檔案時,使用student類便會編譯出錯。或者在程式中引入不同的庫時有相同的實體名,則在編譯時就會出現名字衝突。...
c 之命名空間
c語言中所有變數都有自己的作用域,宣告變數的型別不同,其作用域也不同。c語言中的變數,按照作用域的範圍可分為兩種,即區域性變數和全域性變數,所對應的作用域為區域性作用域和全域性作用域。簡單來說 區域性作用域是指 在函式內作定義說明的。其作用域僅限於函式內,離開該函式後再使用這種變數是非法的。全域性作...
C 之命名空間
命名空間是隨著標準c 而引入的,它相當於乙個更加靈活的檔案域 全域性域 可以用花括號將檔案的一部分括起來,並以關鍵字namespace開頭,給它起乙個名字,這段區域即為命名空間域。命名空間可巢狀使用。namespace name1 namespace name2 name1 a 3 name2 a ...