C 技巧之名字空間namespace

2021-05-01 06:37:47 字數 2260 閱讀 9004

c的開發人員會經常使用#define,即用巨集來宣告常量,但巨集卻是全域性的,對大的工程很難維護,經常是導致名字衝突。還好,c++給我們帶來了namespace名字空間。它的使用如下,名字空間可以把一組邏輯分組,同時名字空間也是一種作用域。

view plain

copy to clipboard

print?

namespace  outspname  

;  

class  klass  

;  

}  

}  

但即使乙個簡單的名字空間,其中也有不少的玄機。

1.當某個名字在自己的空間之外使用,在反覆地在前面加上名字空間作為限定詞, 如

view plain

copy to clipboard

print?

const

int   local  = outspname::inspname::a  

這樣寫是不是很令人煩。在某個小的區域性作用域內,我們可以通過乙個使用宣告。如

view plain

copy to clipboard

print?

2.還有,我們也可以通過乙個使用指令把該名字空間下所有的名字變成可用。如下所示,與第一點的用法區別,是using 後面有個namespace。同樣只在轉換時,或者在乙個小的區域性作用域內使用using namesapce,否則也會帶來名字的汙染。

view plain

copy to clipboard

print?

}  

但使用using namespace這種用法時,要注意下面一點,如在某個.h中宣告了有testname::test的方法。

view plain

copy to clipboard

print?

namespace  testname  

在其.cpp中,不能使用如下這種方式,test方法只是此編譯單元的乙個區域性方法,並非testname名字空間的test方法實現。

view plain

copy to clipboard

print?

using  testname;  

void  test( int  param)  

正確的使用方式是

view plain

copy to clipboard

print?

namespace  testname  

}  

或者是view plain

copy to clipboard

print?

void  testname::test( int  param)  

3.名字空間的別名,當名字空間很長或巢狀很深時,我們可以使用名字空間別名,用法如下:

view plain

copy to clipboard

print?

namespace  oin = outspname::inspname;  

4.無名名字空間,無名名字空間主要是保持**的區域性性,使用如下:

view plain

copy to clipboard

print?

namespace

但一定要注意的一點是,在c++編譯器實現時,無名名字空間其實是有名字的,這個隱含的名字跟它所在編譯單元名字相關。所以基於這一點,我們不能跨編譯單元使用無名名字空間中的名字。

上面的宣告等價於

view plain

copy to clipboard

print?

namespace  $$$  

using

namespace  $$$;  

其中$$$在其所在的作用域裡具有惟一性的名字,每個編譯單元裡的無名名字空間也是互不相同的,using namesapce $$$只是當前的編譯單元的隱含名字,所以不能跨編譯單元使用無名名字空間中的名字。

假設上面的test方法在是a.h與a.cpp中定義與實現的,但在b.h或b.cpp中就不能直接使用test方法或cvar1。因為在b的這個編譯單元中鏈結的是b這個編譯單元中的test符號,並非a編譯單元中的test符號,也就會出現未定符號。

5.要避免名字空間使用很短的名字,也不能太長,更不能巢狀太深了,個人覺得不要超過4層。

C 技巧之名字空間namespace

原文 c的開發人員會經常使用 define,即用巨集來宣告常量,但巨集卻是全域性的,對大的工程很難維護,經常是導致名字衝突。還好,c 給我們帶來了namespace名字空間。它的使用如下,名字空間可以把一組邏輯分組,同時名字空間也是一種作用域。namespace outspname class kl...

C 之名字隱藏

在c 中,當你使用乙個包含了過載方法的類時,並且當你繼承和重寫這個方法後,你必須重寫所有過載的方法。例子 class firstclass void firstclass methoda int i void firstclass methoda int i,int j 這個簡單類有兩個方法 乙個過...

C 名字空間

namespace 名字空間名 注 名字空間成員可以是全域性變數 全域性函式 型別 名字空間 作用域限定操作符 名字空間名 要訪問的成員 include namespace nm1 namespace nm2 intmain 當名字沒有重複的時候,我們可以簡化 方法一 名字空間指令 格式 using...