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

每逢面試時多數(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有兩個作用:

    1. 修飾局部變量:
    • 存儲區(qū)由棧變?yōu)槎训渺o態(tài)存儲區(qū),生存期為整個源程序,可以延長生命周期,生命周期跟整個應(yīng)用程序一致;
    • 作用域仍為局部作用域, 只能在定義該變量的函數(shù)內(nèi)使用。
    • 只初始化一次, 只會分配一次內(nèi)存。
    1. 修飾全局變量:
    • 全局變量本來就是堆中的靜態(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】|那些人追的干貨

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容