static 和extern的區別

weixin_33912445發表於2018-07-23

extern

    1. extern置於變數或者函式前,作用域是整個工程,表示變數或者函式的定義在別的檔案中,通過在變數前新增extern來訪問這個全域性變數,
    1. extern修飾的變數沒有真正的記憶體
#import "Person.h"

@implementation Person

int age = 10;

@end

在main.m檔案中,不需要引入Person類的標頭檔案

int main(int argc, char * argv[]) {
    @autoreleasepool {
        extern int age; // 只要你在全域性變數前加extern,你的這個檔案就可以訪問這個全域性變數
        NSLog(@"age1=%d",age); // age1 = 10
        
        age =  20; // 通過這種方法修改age值
         NSLog(@"age2=%d",age); // age2 = 20
    }
    return 0;
}

static

    1. 只要在全域性變數前加static,那麼這個全域性變數的作用域就會縮小到當前檔案,外界就不能訪問了。
#import "Person.h"


@implementation Person

static int  grade = 10;

@end

在main.m檔案中,不引入Person類的標頭檔案

int main(int argc, char * argv[]) {
    @autoreleasepool {
        extern int grade;
        NSLog(@"grade=%d",grade);  
    }
    return 0;
}

編譯器直接報錯,


1742958-7c571ad8f8a3092f.png
_grade在main中未定義
    1. static讓區域性變數只初始化一次,不改變區域性變數的作用域,僅僅改變了區域性變數的生命週期(只到程式結束,這個區域性變數才會銷燬)
1742958-55eb64233b0c8127.png
用static修飾的區域性變數
1742958-88fc49deab1dcbca.png
沒有用static修飾的區域性變數

相關文章