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

插圖.jpg
  • const, static, extern幾個關(guān)鍵字,在它們的概念和用法上一直有點模糊,整理一下, 以便日后查閱。

1、const

  • 作用

1、 const 僅僅用來修飾它右側(cè)的變量
2、 被const 修飾的變量是只讀的
注: 這就是為什么推薦使用const來替代宏定義, 宏定義不會報錯, 并且是可變的

  • 常量區(qū)分和簡單使用

// 定義一個全局只讀常量。全局常量:不管你定義在任何文件夾,外部都能訪問
1、#import"ViewControllerOne.h"
NSString *const tempString = @"Eugene_iOS";(同const NSString * tempStr = @"Eugene";)
2、#import"ViewControllerTwo.h"
extern NSString * globalStr ;
NSLog(@"==%@==", globalStr);


// 定義一個局部只讀常量。局部常量:用static修飾后,只能本文件訪問,不能提供外界訪問
static NSString *const Key = @"Eugene_iOS”;
- (void)viewDidLoad {
[super viewDidLoad];
//這里修改會報錯,tempString不能被修改
tempString = @"test";
}

  • const修飾位置不同
 // const:修飾基本變量
 const int b = 20; // b:只讀變量
 int const b = 20; // b:只讀變量 
// 不允許修改值
 b = 1; 
//由此可見無論const在int的哪一邊,a和b都是只讀變量.
 // const:修飾指針變量
int * const p1; // *p1:變量 p1:常量 
const int *p1; // *p1:常量 p1:變量 
int const *p1; // *p1:常量 p1:變量 
const int * const p1; // *p1:常量 p1:常量 
int const * const p1; // *p1:常量 p1:常量

補充 (const和define區(qū)別)

const為常量值,define為字符串替換。

  1. const在編譯階段使用;define在預(yù)編譯階段使用。
  2. const有數(shù)據(jù)類型,做安全檢查;define無類型,不做安全檢查。
  3. const可以調(diào)試;define不能調(diào)試。
  4. const占用一份內(nèi)存;define不占用內(nèi)存,但是會多處進行字符串替換
    以上幾點可概括為:
    :只是在預(yù)處理器里進行文本替換,沒有類型,不做任何類型檢查,編譯器可以對相同的字符串進行優(yōu)化。
    常量:共享一塊內(nèi)存空間,就算項目中N處用到,也不會分配N塊內(nèi)存空間,可以根據(jù)const修飾的位置設(shè)定能否修改,在編譯階段會執(zhí)行類型檢查。
    變量:共享一塊內(nèi)存空間,就算項目中N處用到,也不會分配N塊內(nèi)存空間,可以被修改,在編譯階段會執(zhí)行類型檢查。
    宏的好處: 宏能定義一些函數(shù)、方法。 const不能。
    宏的壞處: 使用大量宏,容易造成編譯時間久,每次都需要重新替換。
    參考資料

2、static和extern使用

  • static作用
  • 修飾局部變量:
    1.延長局部變量的生命周期, 程序結(jié)束才會銷毀。
    2.局部變量只會生成一份內(nèi)存, 只會初始化一次。
    3.改變局部變量的作用域。(默認情況下全局變量的作用域是整個程序->可以通過extern來引用 , 被static修飾后僅限于當(dāng)前文件來引用, 其他文件不能通過extern來引用)
  • 修飾全局變量
    1.只能在本文件中訪問, 修改全局變量的作用域,生命周期不會改
    2.避免重復(fù)定義全局變量
  • extern作用
  • 只是用來獲取全局變量(包括全局靜態(tài)變量)的值,不能用于定義變量
  • extern工作原理
  • 先在當(dāng)前文件查找有沒有全局變量,沒有找到,才會去其他文件查找。
  • 簡單舉例
    • 全局變量


      main函數(shù)中調(diào)用People類

      People類中通過extern關(guān)鍵字引用Car中的全局變量

      在Car類中定義一個全局變量
  • 在全局變量前面添加Static關(guān)鍵字后


    項目報錯,提示"_carPrice"為定義
// 全局變量:只有一份內(nèi)存,所有文件共享,與extern聯(lián)合使用。
int a = 20;
// static修飾全局變量
static int age = 20;
- (void)test {
    // static修飾局部變量
    static int age = 0;
    age++;
    NSLog(@"%d",age);
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self test];
    [self test];
    extern int age;
    NSLog(@"%d",age);
} 

感謝??

參考資料1
參考資料2

最后編輯于
?著作權(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)容