每逢面試時(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è)作用:
-
- 修飾局部變量:
- 存儲(chǔ)區(qū)由棧變?yōu)槎训渺o態(tài)存儲(chǔ)區(qū),生存期為整個(gè)源程序,可以延長(zhǎng)生命周期岂丘,生命周期跟整個(gè)應(yīng)用程序一致陵究;
- 作用域仍為局部作用域, 只能在定義該變量的函數(shù)內(nèi)使用。
- 只初始化一次, 只會(huì)分配一次內(nèi)存奥帘。
-
- 修飾全局變量:
- 全局變量本來(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)一次趴久。
- 就是說(shuō),我們?cè)谝粋€(gè)類(lèi)中定義了全局變量
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】|那些人追的干貨