const,static,extern使用

前言

在實際開發(fā)中,const,static,extern是被我們高頻率的使用的關(guān)鍵字睬澡。下面具體說明下,這三個關(guān)鍵字最基本的用法斗躏。


目錄

   一啄糙、 宏與const的區(qū)別   
   二云稚、 const作用:限制類型
   三、 const使用場景
   四燕雁、static和extern使用
   五拐格、static與const聯(lián)合使用
   六刑赶、extern與const聯(lián)合使用

一、 宏與const的區(qū)別

現(xiàn)在定義常用的字符串常量金踪,一般抽成宏來處理。but蘋果不建議我們這樣使用沛申,而是推薦我們使用const這個關(guān)鍵字定義姐军。
具體區(qū)別

  1. 編譯時刻:宏是預(yù)編譯奕锌,const是編譯階段村生。
  2. 編譯檢查:宏不做檢查,不會報編譯錯誤辽话,只是替換;const會編譯檢查油啤,能編譯報錯蟀苛。
  3. 宏的好處:宏能定義一些函數(shù)、方法幽告。const不能冗锁。
  4. 宏的缺點: 大量使用宏嗤栓,會造成編譯時間太久(每次都要重新替換)。

二芋绸、 const作用:限制類型

  • const僅僅用來修飾右邊的變量(基本數(shù)據(jù)變量p摔敛,指針變量*p)
  • 被const修飾的變量是 只讀 的全封。
    具體使用桃犬,代碼如下:
- (void)viewDidLoad {
        [super viewDidLoad];
        int a = 1;  // 定義變量
        a = 20; // 允許修改值
        
        // const兩種用法   
        //第一:const:修飾基本變量p. 這兩種寫法是一樣的攒暇,const只修飾右邊的基本變量b
        const int b = 20; // b:只讀變量
        int const b = 20; // b:只讀變量
        b = 1;// 不允許修改值
        
        // 第二:const:修飾指針變量*p形用。
        // 定義一個指向int類型的指針變量证杭,指向a的地址
        int *p = &a;
        int c = 10;
        p = &c;
        // 允許修改p指向的地址解愤, 允許修改p訪問內(nèi)存空間的值
        *p = 20;
        
        // const修飾指針變量訪問的內(nèi)存空間,修飾的是右邊*p1奸笤,
        //兩種方式一樣
        (第一種)
        const int *p1; // *p1:常量 p1:變量
        int const *p1; // *p1:常量 p1:變量
        
       (第二種)
        // const修飾指針變量p1
        int * const p1; // *p1:變量 p1:常量
    
        // 第一個const修飾*p1 第二個const修飾 p1
        // 兩種方式一樣
        const int * const p1; // *p1:常量 p1:常量
        int const * const p1;  // *p1:常量 p1:常量      
  }

三监右、const使用場景

  1. 提供一個方法魄宏,這個方法的參數(shù)是地址宠互,里面只能通過地址讀取值,而不能通過地址修改值搏色。
  2. 提供一個方法券册,這個方法的參數(shù)是地址烁焙,里面不能修改參數(shù)的地址。
    具體使用場景膳殷,代碼如下
- (void)test1:(const int * )a
{
    *a = 20;//const放*前面約束參數(shù)九火,表示*a只讀 (此處編譯不通過)
    
    int b;
    a = &b; // 只能修改地址a,不能通過a修改訪問的內(nèi)存空間
}

// const放*后面約束參數(shù),表示a只讀
- (void)test2:(int * const)a
{
    int b;
    a = &b; // 不能修改a的地址勒极。(此處編譯不通過)
    
    *a = 2; //可以通過a的地址修改值
}

- (void)viewDidLoad {
    [super viewDidLoad];
    int a = 10;
    // 需求1:提供一個方法,這個方法的參數(shù)是地址键痛,里面只能通過地址讀取值,不能通過地址修改值散休。
    // 這時候就需要使用const乐尊,約束方法的參數(shù)只讀.
    [self test1:&a];
    // 需求2:提供一個方法划址,這個方法的參數(shù)是地址夺颤,里面不能修改參數(shù)的地址。
    [self test2:&a];
}

四独旷、static和extern使用

  1. static作用
    • 修飾局部變量

      1. 延長局部變量的生命周期寥裂,程序結(jié)束才銷毀
      2. 局部變量只會生成一份封恰,只會初始化一次。
      3. 改變局部變量的作用域
    • 修飾全局變量

      1. 只能在本文件中訪問鳖昌,修改全局變量的作用域低飒,生命周期不會改變
      2. 避免重復(fù)定義全局變量
  2. extern作用
    • 用來獲取全局變量的值褥赊,但是不能用于定義常量
  3. extern工作原理
    • 首先在當(dāng)前文件查找有沒有全局變量,未找到會去其他文件查找

具體使用翼岁,代碼如下

int a = 20;
static int age = 2;

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self test];
    extern int age;
    age++;
    NSLog(@"%d,%d",age,a);
}

- (void)test
{
    static int age = 0;
    age++;
    NSLog(@"%d",age);
}

五、static與const聯(lián)合使用

  • static與const作用:聲明一個只讀的靜態(tài)變量
  • 開發(fā)使用場景:在一個文件中經(jīng)常使用的字符串常量悉患,可以使用static和const組合
    *** 代碼如下 ***
// 開發(fā)中常用static修飾全局變量,只改變作用域
// 為什么要改變?nèi)肿兞孔饔糜蚴墼辏乐怪貜?fù)聲明全局變量茴晋。
// 開發(fā)中聲明的全局變量,有些不希望外界改動市袖,只允許讀取烁涌。
// 比如一個基本數(shù)據(jù)類型不希望別人改動

// 聲明一個靜態(tài)的全局只讀常量
static const int a = 20;

// 開發(fā)中經(jīng)常拿到key修改值撮执,因此用const修飾key,表示key只讀,不允許修改蜓肆。
static  NSString * const key = @"name";

// 如果 const修飾 *key1,表示*key1只讀谋币,key1還是能改變。
static  NSString const *key1 = @"name";

六厉颤、extern與const聯(lián)合使用

  • 使用場景:多個文件中共用一個字符串常量逼友,可以使用extern和const組合秤涩。

  • 原因

    • static與const組合:在每個文件都需要定義一份靜態(tài)全局常量
  • extern與const組合: 只需要定義一份全局變量,多個文件共享

  • 全局常量寫法: 開發(fā)中便于管理所有的全局常量黎烈,一般會創(chuàng)建一個專門的類來管理照棋。
    *** xxx .h***

  extern NSString * const Key = @"name";

*** xxx.m***

NSSting *const key =@"name";
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溶锭,一起剝皮案震驚了整個濱河市趴捅,隨后出現(xiàn)的幾起案子霹疫,更是在濱河造成了極大的恐慌,老刑警劉巖猎拨,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迟几,死亡現(xiàn)場離奇詭異栏笆,居然都是意外死亡臊泰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門针饥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丁眼,“玉大人昭殉,你說我怎么就攤上這事挪丢。” “怎么了惠啄?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵撵渡,是天一觀的道長。 經(jīng)常有香客問我丹鸿,道長棚品,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任门怪,我火速辦了婚禮锅纺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坦弟。我一直安慰自己,他們只是感情好酿傍,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布赤炒。 她就那樣靜靜地躺著亏较,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遵岩。 梳的紋絲不亂的頭發(fā)上巡通,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天扁达,我揣著相機(jī)與錄音,去河邊找鬼跪解。 笑死签孔,一個胖子當(dāng)著我的面吹牛饥追,可吹牛的內(nèi)容都是我干的罐盔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捏顺,長吁一口氣:“原來是場噩夢啊……” “哼纬黎!你這毒婦竟也來了本今?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挪凑,失蹤者是張志新(化名)和其女友劉穎逛艰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唐断,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年恳啥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翁垂。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡沿猜,死狀恐怖啼肩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祈坠,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布慌随,位于F島的核電站阁猜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蹦漠。R本人自食惡果不足惜车海,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一侍芝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧州叠,春花似錦、人聲如沸咧栗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斟或。三九已至萝挤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間端蛆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工今豆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亭罪。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓应役,卻偏偏與公主長得像燥筷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袍祖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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