const,static,extern關(guān)鍵字

每逢面試時(shí)多數(shù)會(huì)問(wèn)到 const與宏的區(qū)別static變量

先看下const與宏的區(qū)別:

  • 編譯時(shí)刻:宏是預(yù)編譯(編譯之前處理)苇羡,const是編譯階段陷遮。
  • 編譯檢查:宏不做檢查度帮,不會(huì)報(bào)編譯錯(cuò)誤本慕,只是替換搪泳,const會(huì)編譯檢查栗涂,會(huì)報(bào)編譯錯(cuò)誤驾霜。
  • 宏的好處:宏能定義一些函數(shù)耕餐,方法。 const不能旺上。
  • 宏的壞處:使用大量宏瓶蚂,容易造成編譯時(shí)間久,每次都需要重新替換宣吱。

static局部變量和普通局部變量有什么區(qū)別

  • 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期窃这。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍征候。
  • static局部變量只被初始化一次杭攻,下一次依據(jù)上一次結(jié)果值祟敛;

下面就看下const,static,extern定義和簡(jiǎn)單使用

一、關(guān)于const

1. const簡(jiǎn)述*

  • const修飾的數(shù)據(jù)類(lèi)型是指常類(lèi)型兆解,常類(lèi)型的變量或?qū)ο蟮闹凳遣荒鼙桓碌墓萏K薅ㄒ粋€(gè)變量不允許被改變,產(chǎn)生靜態(tài)作用痪宰。
    const的作用和宏是很類(lèi)似的叼架,其實(shí)畔裕,蘋(píng)果是不推薦我們使用宏的衣撬,它更喜歡我們使用const,在swift中宏就被拋棄了扮饶,我們只能使用const具练。

2. const有兩個(gè)作用:

  • 修飾右邊的基本數(shù)據(jù)變量和指針變量;

  • 被const修飾的變量只讀,也就是只能獲取,不能修改甜无。

3. const的使用場(chǎng)景:

  • 修飾全局變量 ==>全局只讀變量 ==> 代替宏

  • 修飾方法中的參數(shù)

二扛点、關(guān)于static

static有兩個(gè)作用:

    1. 修飾局部變量:
    • 存儲(chǔ)區(qū)由棧變?yōu)槎训渺o態(tài)存儲(chǔ)區(qū),生存期為整個(gè)源程序,可以延長(zhǎng)生命周期岂丘,生命周期跟整個(gè)應(yīng)用程序一致陵究;
    • 作用域仍為局部作用域, 只能在定義該變量的函數(shù)內(nèi)使用。
    • 只初始化一次, 只會(huì)分配一次內(nèi)存奥帘。
    1. 修飾全局變量:
    • 全局變量本來(lái)就是堆中的靜態(tài)區(qū), 生命周期沒(méi)有改變
    • 作用域會(huì)修改, 只能在當(dāng)前文件下使用
    • 好處就是: 不會(huì)被其他文件所訪(fǎng)問(wèn)铜邮,修改。其他文件中可以使用相同名字的變量寨蹋,不會(huì)發(fā)生沖突松蒜。

三、關(guān)于extern

上面說(shuō)到static修飾的全局靜態(tài)變量已旧,作用域是聲明此變量所在的文件秸苗。而extern恰恰相反, extern修飾的全局變量默認(rèn)是有外部鏈接的,作用域是整個(gè)工程运褪,在一個(gè)文件內(nèi)定義的全局變量惊楼,在另一個(gè)文件中,通過(guò)extern聲明全局變量秸讹,就可以使用這個(gè)全局變量了檀咙。

1. extern簡(jiǎn)述

extern修飾全局變量的聲明。以表示變量的定義在別的文件中嗦枢。一般情況下默認(rèn)攀芯,定義的全局變量都帶有extern。

2. extern作用:

  • 僅適于修飾全局變量文虏,不能去修飾其他的變量
  • 只是用來(lái)獲取全局變量, 不能定義變量
  • 置于變量前侣诺,以表示變量的定義在別的文件中殖演。
    • 就是說(shuō),我們?cè)谝粋€(gè)類(lèi)中定義了全局變量NSString *name = @"hello world!"。但是想在別的類(lèi)中使用這個(gè)全局變量, 無(wú)需引入頭文件,只需要通過(guò)extern NSString *name;(并沒(méi)有分配內(nèi)存的),就可以獲取到相應(yīng)的全局變量進(jìn)行后續(xù)操作年鸳。
    • 注意使用extern NSString *name;獲取的變量name的定義只能出現(xiàn)一次趴久。

3. extern工作原理:

  • 先會(huì)去當(dāng)前文件下查找有沒(méi)有對(duì)應(yīng)全局變量,如果沒(méi)有,才會(huì)去其他文件查找。

所以注意: 任何情況下全局變量都是不安全的搔确! 隨時(shí)可能會(huì)被別人改掉彼棍。這是重點(diǎn), 重點(diǎn), 重點(diǎn) ! ! !

四、實(shí)際應(yīng)用

在項(xiàng)目開(kāi)發(fā)中我常常這樣用到

static NSString *kActivity = @"這是全局Activity";
static const NSString *encryDESkey = @"這是全局只讀的秘鑰12345678";
static const NSInteger kTextFeildTag = 07161547;
const CGFloat PAI = 3.14;

開(kāi)發(fā)中常用static修飾全局變量, 只是改變作用域, 防止重復(fù)聲明全局變量膳算。但有些是不希望外界改動(dòng)座硕,只允許讀取的, 就可以通過(guò)static與const聯(lián)合使用達(dá)到目的。

static與const聯(lián)合使用的作用:*

  • 聲明一個(gè)只讀的靜態(tài)全局變量

static const聯(lián)合使用修飾變量和宏#define定義的比較

  • 相同點(diǎn)
    • 都不能再被修改, 一處修改涕蜂,其它都改了
  • 不同點(diǎn)
    • static const修飾變量只有一份內(nèi)存
    • 宏定義华匾,只是簡(jiǎn)單的替換,每次使用都需要?jiǎng)?chuàng)建一份內(nèi)存

所以, 使用static const修飾更加高效机隙,在同一個(gè)文件內(nèi)可以使用static const取代#define

上面只是簡(jiǎn)單說(shuō)了下const,static,extern關(guān)鍵字的作用及特點(diǎn), 網(wǎng)上有很多關(guān)于這些的詳細(xì)介紹, 也搜集了一些, 有興趣研究的可以看看蜘拉。

五. 關(guān)于static關(guān)鍵字的面試題

(來(lái)源于網(wǎng)絡(luò))

static全局變量與普通的全局變量有什么區(qū)別

  • 全局變量(外部變量)的聲明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。
  • 全局變量本身就是靜態(tài)存儲(chǔ)方式有鹿, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式旭旭。 這兩者在存儲(chǔ)方式上并無(wú)不同。
  • static全局變量只初使化一次葱跋,防止在其他文件單元中被引用;

區(qū)別在于: 非靜態(tài)全局變量的作用域是整個(gè)源程序持寄, 當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的年局。 而靜態(tài)全局變量則限制了其作用域际看, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它矢否。由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內(nèi)仲闽,只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其它源文件中引起錯(cuò)誤僵朗。

static局部變量和普通局部變量有什么區(qū)別

  • 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期赖欣。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍验庙。
  • static局部變量只被初始化一次顶吮,下一次依據(jù)上一次結(jié)果值;

static函數(shù)與普通函數(shù)有什么區(qū)別 (C語(yǔ)言中)

  • static函數(shù)與普通函數(shù)作用域不同,僅在本文件粪薛。只在當(dāng)前源文件中使用的函數(shù)應(yīng)該說(shuō)明為內(nèi)部函數(shù)(static修飾的函數(shù))悴了,內(nèi)部函數(shù)應(yīng)該在當(dāng)前源文件中說(shuō)明和定義。對(duì)于可在當(dāng)前源文件以外使用的函數(shù),應(yīng)該在一個(gè)頭文件中說(shuō)明湃交,要使用這些函數(shù)的源文件要包含這個(gè)頭文件.
  • static函數(shù)在內(nèi)存中只有一份熟空,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝

推薦鏈接:
const extern static 終極指南
如何正確使用const,static,extern
【如何正確使用const,static,extern】|那些人追的干貨

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市搞莺,隨后出現(xiàn)的幾起案子息罗,更是在濱河造成了極大的恐慌,老刑警劉巖才沧,帶你破解...
    沈念sama閱讀 212,686評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迈喉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡温圆,警方通過(guò)查閱死者的電腦和手機(jī)挨摸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捌木,“玉大人油坝,你說(shuō)我怎么就攤上這事嫉戚∨亳桑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,160評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵彬檀,是天一觀(guān)的道長(zhǎng)帆啃。 經(jīng)常有香客問(wèn)我,道長(zhǎng)窍帝,這世上最難降的妖魔是什么努潘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,736評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮坤学,結(jié)果婚禮上疯坤,老公的妹妹穿的比我還像新娘。我一直安慰自己深浮,他們只是感情好压怠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著飞苇,像睡著了一般菌瘫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上布卡,一...
    開(kāi)封第一講書(shū)人閱讀 50,043評(píng)論 1 291
  • 那天雨让,我揣著相機(jī)與錄音,去河邊找鬼忿等。 笑死栖忠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庵寞,決...
    沈念sama閱讀 39,129評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼虚汛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了皇帮?” 一聲冷哼從身側(cè)響起卷哩,我...
    開(kāi)封第一講書(shū)人閱讀 37,872評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎属拾,沒(méi)想到半個(gè)月后将谊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,318評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渐白,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評(píng)論 2 327
  • 正文 我和宋清朗相戀三年尊浓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纯衍。...
    茶點(diǎn)故事閱讀 38,777評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栋齿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出襟诸,到底是詐尸還是另有隱情瓦堵,我是刑警寧澤,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布歌亲,位于F島的核電站菇用,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏陷揪。R本人自食惡果不足惜惋鸥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悍缠。 院中可真熱鬧卦绣,春花似錦、人聲如沸飞蚓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,861評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玷坠。三九已至蜗搔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間八堡,已是汗流浹背樟凄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兄渺,地道東北人缝龄。 一個(gè)月前我還...
    沈念sama閱讀 46,589評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親叔壤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞎饲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評(píng)論 2 351

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