關於namespace的檔案組織

2021-08-09 05:44:00 字數 1910 閱讀 5100

在c++新規定裡面,引入了#include的方式,而雖然對#include相容,但是前者解決了在大檔案時候的命名衝突問題,下面就討論一下namespace是如何使用,c++中的容器等使用時候為什麼必須加std::,如std::vectorvi。

我檢視了一下c++中的標頭檔案(這裡是不包含.h的模板標頭檔案,關於標頭檔案的組織形式,可以參考:c語言中關於.h和.c的問題和.h檔案和.cpp檔案組織結構),在c++的標準標頭檔案中,都有_std_begin作為開頭,然後用_std_end作為結尾,中間包含了檔案的宣告和定義。而_std_begin和_std_end是巨集定義,如下:  

[cpp]view plain

copy

print?

#define _std_begin  namespace std 

#define _std_begin	namespace std
可見,c++中的標頭檔案都是定義在std的空間裡的,因此,你即使包含了#include如果不用std,仍然是不能使用iostream類的,因為這個類是在std這個命名空間裡面,只能用std::iostream才可以。當然命名空間的三種使用方法都是可以的,如下:

一是:using namespace std;

二是:using iostream;

三是:std::iostream

到此就解釋了為什麼#includeusing namespace std;會一起出現,而#include時候就不需要std命名空間了。

再說一下如何定義自己的命名空間。

一般位元組寫namespace的時候如果是用模板,只能寫在乙個檔案裡面,這時候也不會出現定義衝突等問題。但是如果按一般的寫成.h檔案和.cpp檔案,就需要注意一些細節問題。首先,在.h檔案中定義namespace,這是肯定的,但是這時候的namespace中只能是宣告,不能有定義,因為這是和普通的.h檔案一樣的,如果在.h檔案中進行定義,那麼在多個包含它的.cpp檔案中就會報錯,說重複定義。所以,.h檔案中放宣告,而把定義放在.cpp檔案中。其次在.cpp中定義的時候一定要加上原來的命名空間,加入你定義了命名空間:namespace mm{},(注意後面沒有分號,和類、結構體的定義不同),在.cpp中進行定義時,必須加上mm,如定義函式時,mm::fun(),定義變數時,int mm::a等。最後在其它檔案中需要用的時候不但要加上#include"***.h",還需要加上,using namespace mm;,上面的三種說明方式都可以用。

下面是乙個例子,可以幫助理解:

[cpp]view plain

copy

print?

檔案#ifndef __a_h__

#define __a_h__

namespace mm  

;  extern

int a,b;  

}  #endif

檔案

#ifndef __a_h__

#define __a_h__

namespace mm

; extern int a,b;

}#endif

[cpp]view plain

copy

print?

檔案#include

#include"a.h"

using

namespace std;  

int mm::a=10;  

int mm::b=20;  

void mm::fun()    

檔案#include#include"a.h"

using namespace std;

int mm::a=10;

int mm::b=20;

void mm::fun()  

關於C 中的namespace

還有一篇是蔣namespace的,這個東西比巨集定義能讓人稍稍好接受一點點,但是看完以後還是一頭霧水,反正也就先迷迷濛濛的吧 依舊戳我 namespace中文意思是命名空間或者叫名字空間,傳統的c 只有乙個全域性的namespace,但是由於現在的程式的規模越來越大,程式的分工越來越細,全域性作用域...

轉 關於c 中namespace

namespace中文意思是命名空間或者叫名字空間,傳統的c 只有乙個全域性的namespace,但是由於現在的程式的規模越來越大,程式的分工越來越細,全域性作用域變得越來越擁擠,每個人都可能使用相同的名字來實現不同的庫,於是程式設計師在合併程式的時候就會可能出現名字的衝突。namespace引入了...

關於js中namespace命名空間模式

命名空間有助於減少程式中所需要的全域性變數的數量,並且同時有助於避免命名衝突或過長的名字字首。關於命名空間的例子 1 234 5 67 8 9 返回指定的命名空間,如果命名空間不存在則建立命名空間。10 備註 命名時需小心,注意保留關鍵字,可能在一些瀏覽器無法使用。11 12 method name...