每逢面試時多數(shù)會問到 const與宏的區(qū)別 及 static變量
先看下const與宏的區(qū)別:
- 編譯時刻:宏是預(yù)編譯(編譯之前處理),const是編譯階段。
- 編譯檢查:宏不做檢查,不會報編譯錯誤,只是替換,const會編譯檢查,會報編譯錯誤。
- 宏的好處:宏能定義一些函數(shù),方法。 const不能。
- 宏的壞處:使用大量宏,容易造成編譯時間久,每次都需要重新替換。
static局部變量和普通局部變量有什么區(qū)別
- 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。
- static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值;
下面就看下const,static,extern定義和簡單使用
一、關(guān)于const
1. const簡述*
- const修飾的數(shù)據(jù)類型是指常類型,常類型的變量或?qū)ο蟮闹凳遣荒鼙桓碌?。它限定一個變量不允許被改變,產(chǎn)生靜態(tài)作用。
const的作用和宏是很類似的,其實,蘋果是不推薦我們使用宏的,它更喜歡我們使用const,在swift中宏就被拋棄了,我們只能使用const。
2. const有兩個作用:
修飾右邊的基本數(shù)據(jù)變量和指針變量;
被const修飾的變量只讀,也就是只能獲取,不能修改。
3. const的使用場景:
修飾全局變量 ==>全局只讀變量 ==> 代替宏
修飾方法中的參數(shù)
二、關(guān)于static
static有兩個作用:
-
- 修飾局部變量:
- 存儲區(qū)由棧變?yōu)槎训渺o態(tài)存儲區(qū),生存期為整個源程序,可以延長生命周期,生命周期跟整個應(yīng)用程序一致;
- 作用域仍為局部作用域, 只能在定義該變量的函數(shù)內(nèi)使用。
- 只初始化一次, 只會分配一次內(nèi)存。
-
- 修飾全局變量:
- 全局變量本來就是堆中的靜態(tài)區(qū), 生命周期沒有改變
- 作用域會修改, 只能在當(dāng)前文件下使用
- 好處就是: 不會被其他文件所訪問,修改。其他文件中可以使用相同名字的變量,不會發(fā)生沖突。
三、關(guān)于extern
上面說到static修飾的全局靜態(tài)變量,作用域是聲明此變量所在的文件。而extern恰恰相反, extern修飾的全局變量默認(rèn)是有外部鏈接的,作用域是整個工程,在一個文件內(nèi)定義的全局變量,在另一個文件中,通過extern聲明全局變量,就可以使用這個全局變量了。
1. extern簡述
extern修飾全局變量的聲明。以表示變量的定義在別的文件中。一般情況下默認(rèn),定義的全局變量都帶有extern。
2. extern作用:
- 僅適于修飾全局變量,不能去修飾其他的變量
- 只是用來獲取全局變量, 不能定義變量
- 置于變量前,以表示變量的定義在別的文件中。
- 就是說,我們在一個類中定義了全局變量
NSString *name = @"hello world!"。但是想在別的類中使用這個全局變量, 無需引入頭文件,只需要通過extern NSString *name;(并沒有分配內(nèi)存的),就可以獲取到相應(yīng)的全局變量進(jìn)行后續(xù)操作。 -
注意使用extern NSString *name;獲取的變量name的定義只能出現(xiàn)一次。
- 就是說,我們在一個類中定義了全局變量
3. extern工作原理:
- 先會去當(dāng)前文件下查找有沒有對應(yīng)全局變量,如果沒有,才會去其他文件查找。
所以注意: 任何情況下全局變量都是不安全的! 隨時可能會被別人改掉。這是重點, 重點, 重點 ! ! !
四、實際應(yīng)用
在項目開發(fā)中我常常這樣用到
static NSString *kActivity = @"這是全局Activity";
static const NSString *encryDESkey = @"這是全局只讀的秘鑰12345678";
static const NSInteger kTextFeildTag = 07161547;
const CGFloat PAI = 3.14;
開發(fā)中常用static修飾全局變量, 只是改變作用域, 防止重復(fù)聲明全局變量。但有些是不希望外界改動,只允許讀取的, 就可以通過static與const聯(lián)合使用達(dá)到目的。
static與const聯(lián)合使用的作用:*
- 聲明一個只讀的靜態(tài)全局變量
static const聯(lián)合使用修飾變量和宏#define定義的比較
- 相同點
- 都不能再被修改, 一處修改,其它都改了
- 不同點
- static const修飾變量只有一份內(nèi)存
- 宏定義,只是簡單的替換,每次使用都需要創(chuàng)建一份內(nèi)存
所以, 使用static const修飾更加高效,在同一個文件內(nèi)可以使用static const取代#define
上面只是簡單說了下const,static,extern關(guān)鍵字的作用及特點, 網(wǎng)上有很多關(guān)于這些的詳細(xì)介紹, 也搜集了一些, 有興趣研究的可以看看。
五. 關(guān)于static關(guān)鍵字的面試題
(來源于網(wǎng)絡(luò))
static全局變量與普通的全局變量有什么區(qū)別
- 全局變量(外部變量)的聲明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。
- 全局變量本身就是靜態(tài)存儲方式, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲方式。 這兩者在存儲方式上并無不同。
- static全局變量只初使化一次,防止在其他文件單元中被引用;
區(qū)別在于: 非靜態(tài)全局變量的作用域是整個源程序, 當(dāng)一個源程序由多個源文件組成時,非靜態(tài)的全局變量在各個源文件中都是有效的。 而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其它源文件中引起錯誤。
static局部變量和普通局部變量有什么區(qū)別
- 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。
- static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值;
static函數(shù)與普通函數(shù)有什么區(qū)別 (C語言中)
- static函數(shù)與普通函數(shù)作用域不同,僅在本文件。只在當(dāng)前源文件中使用的函數(shù)應(yīng)該說明為內(nèi)部函數(shù)(static修飾的函數(shù)),內(nèi)部函數(shù)應(yīng)該在當(dāng)前源文件中說明和定義。對于可在當(dāng)前源文件以外使用的函數(shù),應(yīng)該在一個頭文件中說明,要使用這些函數(shù)的源文件要包含這個頭文件.
- static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個被調(diào)用中維持一份拷貝
推薦鏈接:
const extern static 終極指南
如何正確使用const,static,extern
【如何正確使用const,static,extern】|那些人追的干貨