C++命名空間(名字空間)詳解

C++命名空間(名字空間)詳解

一個(gè)中大型軟件往往由多名程序員共同開發(fā),會(huì)使用大量的變量和函數(shù)瑰妄,不可避免地會(huì)出現(xiàn)變量或函數(shù)的命名沖突陷嘴。當(dāng)所有人的代碼都測(cè)試通過,沒有問題時(shí)间坐,將它們結(jié)合到一起就有可能會(huì)出現(xiàn)命名沖突罩旋。

例如小李和小韓都參與了一個(gè)文件管理系統(tǒng)的開發(fā),它們都定義了一個(gè)全局變量 fp眶诈,用來指明當(dāng)前打開的文件,將他們的代碼整合在一起編譯時(shí)瓜饥,很明顯編譯器會(huì)提示 fp 重復(fù)定義(Redefinition)錯(cuò)誤逝撬。

為了解決合作開發(fā)時(shí)的命名沖突問題,C++ 引入了命名空間(Namespace)的概念乓土。請(qǐng)看下面的例子:

namespace Li{? //小李的變量定義

? ? FILE fp = NULL;

}

namespace Han{? //小韓的變量定義

? ? FILE fp = NULL

}

小李與小韓各自定義了以自己姓氏為名的命名空間宪潮,此時(shí)再將他們的 fp 變量放在一起編譯就不會(huì)有任何問題。

命名空間有時(shí)也被稱為名字空間趣苏、名稱空間狡相。

namespace 是C++中的關(guān)鍵字,用來定義一個(gè)命名空間食磕,語法格式為:

namespace name{

? ? //variables, functions, classes

}

name是命名空間的名字尽棕,它里面可以包含變量、函數(shù)彬伦、類滔悉、typedef伊诵、#define 等,最后由{ }包圍回官。

使用變量曹宴、函數(shù)時(shí)要指明它們所在的命名空間。以上面的 fp 變量為例歉提,可以這樣來使用:

Li::fp = fopen("one.txt", "r");? //使用小李定義的變量 fp

Han::fp = fopen("two.txt", "rb+");? //使用小韓定義的變量 fp

::是一個(gè)新符號(hào)笛坦,稱為域解析操作符,在C++中用來指明要使用的命名空間苔巨。

除了直接使用域解析操作符版扩,還可以采用 using 關(guān)鍵字聲明,例如:

using Li::fp;

fp = fopen("one.txt", "r");? //使用小李定義的變量 fp

Han :: fp = fopen("two.txt", "rb+");? //使用小韓定義的變量 fp

在代碼的開頭用using聲明了 Li::fp恋拷,它的意思是资厉,using 聲明以后的程序中如果出現(xiàn)了未指明命名空間的 fp,就使用 Li::fp蔬顾;但是若要使用小韓定義的 fp宴偿,仍然需要 Han::fp。

using 聲明不僅可以針對(duì)命名空間中的一個(gè)變量诀豁,也可以用于聲明整個(gè)命名空間窄刘,例如:

using namespace Li;

fp = fopen("one.txt", "r");? //使用小李定義的變量 fp

Han::fp = fopen("two.txt", "rb+");? //使用小韓定義的變量 fp

如果命名空間 Li 中還定義了其他的變量,那么同樣具有 fp 變量的效果舷胜。在 using 聲明后娩践,如果有未具體指定命名空間的變量產(chǎn)生了命名沖突,那么默認(rèn)采用命名空間 Li 中的變量烹骨。

命名空間內(nèi)部不僅可以聲明或定義變量翻伺,對(duì)于其它能在命名空間以外聲明或定義的名稱,同樣也都能在命名空間內(nèi)部進(jìn)行聲明或定義沮焕,例如類吨岭、函數(shù)、typedef峦树、#define 等都可以出現(xiàn)在命名空間中辣辫。

站在編譯和鏈接的角度,代碼中出現(xiàn)的變量名魁巩、函數(shù)名急灭、類名等都是一種符號(hào)(Symbol)。有的符號(hào)可以指代一個(gè)內(nèi)存位置谷遂,例如變量名葬馋、函數(shù)名;有的符號(hào)僅僅是一個(gè)新的名稱,例如 typedef 定義的類型別名点楼。

下面來看一個(gè)命名空間完整示例代碼:

#include <stdio.h>

//將類定義在命名空間中

namespace Diy{

? ? class Student{

? ? public:

? ? ? ? char *name;

? ? ? ? int age;

? ? ? ? float score;


? ? public:

? ? ? ? void say(){

? ? ? ? ? ? printf("%s的年齡是 %d扫尖,成績(jī)是 %f\n", name, age, score);

? ? ? ? }

? ? };

}

int main(){

? ? Diy::Student stu1;

? ? stu1.name = "小明";

? ? stu1.age = 15;

? ? stu1.score = 92.5f;

? ? stu1.say();

? ? return 0;

}

運(yùn)行結(jié)果:

小明的年齡是 15,成績(jī)是 92.500000

C++ 命名空間的語法比較復(fù)雜掠廓,本節(jié)所講到的只是冰山一角换怖,主要是為下節(jié)《C++頭文件和std命名空間》的講解打基礎(chǔ)。關(guān)于命名空間的更多內(nèi)容我們將在后續(xù)章節(jié)中一一講解蟀瞧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沉颂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子悦污,更是在濱河造成了極大的恐慌铸屉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件切端,死亡現(xiàn)場(chǎng)離奇詭異彻坛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)踏枣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門昌屉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茵瀑,你說我怎么就攤上這事间驮。” “怎么了马昨?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵竞帽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鸿捧,道長(zhǎng)屹篓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任匙奴,我火速辦了婚禮堆巧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饥脑。我一直安慰自己,他們只是感情好懦冰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布灶轰。 她就那樣靜靜地躺著,像睡著了一般刷钢。 火紅的嫁衣襯著肌膚如雪笋颤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音伴澄,去河邊找鬼赋除。 笑死,一個(gè)胖子當(dāng)著我的面吹牛非凌,可吹牛的內(nèi)容都是我干的举农。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼敞嗡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼颁糟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喉悴,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤棱貌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后箕肃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婚脱,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年勺像,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了障贸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咏删,死狀恐怖惹想,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情督函,我是刑警寧澤嘀粱,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站辰狡,受9級(jí)特大地震影響锋叨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宛篇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一娃磺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叫倍,春花似錦偷卧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蚕泽,卻和暖如春晌梨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工仔蝌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泛领,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓敛惊,卻偏偏與公主長(zhǎng)得像渊鞋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子豆混,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一篓像、 為什么需要命名空間(問題提出) 命名空間是ANSIC++引入的可以由用戶命名的作用域,用來處理程序中 常見的...
    IvanRunning閱讀 2,359評(píng)論 0 2
  • 技術(shù)交流QQ群:1027579432皿伺,歡迎你的加入员辩! 1.Cpp中的命名空間 假設(shè)這樣一種情況,當(dāng)一個(gè)班上有兩個(gè)名...
    CurryCoder閱讀 185評(píng)論 0 1
  • 本文轉(zhuǎn)載自:C++ 命名空間namespace 在C++中鸵鸥,名稱(name)可以是符號(hào)常量奠滑、變量、宏妒穴、函數(shù)宋税、結(jié)構(gòu)、...
    Yihulee閱讀 5,044評(píng)論 0 6
  • ^函數(shù)重載的匹配: 當(dāng)函數(shù)名被重載后讼油,函數(shù)的匹配過程:首先尋找能精確匹配的函數(shù)杰赛,如果未能精確匹配,則嘗試...
    魯大帥閱讀 1,016評(píng)論 0 1
  • { "Unterminated string literal.": "未終止的字符串文本矮台。", "Identifi...
    Elbert_Z閱讀 10,829評(píng)論 0 2