C 技巧之名字空間namespace

2021-07-09 15:20:58 字數 1476 閱讀 6573

原文:

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

namespace outspname

;class klass ;}

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

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

const

int local = outspname:

:inspname::a

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

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

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

namespace testname

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

using testname;

void test(

int param)

正確的使用方式是

namespace testname }

或者是void testname:

:test(

int param)

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

namespace oin = outspname:

:inspname;

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

namespace

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

上面的宣告等價於

namespace $$$

using namespace $$$;

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

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

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

0 給主人留下些什麼吧!~~

C 技巧之名字空間namespace

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

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...