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