const,static,extern关键字

每逢面试时多数会问到 const与宏的区别static变量

先看下const与宏的区别:

  • 编译时刻:宏是预编译(编译之前处理),const是编译阶段。
  • 编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。
  • 宏的好处:宏能定义一些函数,方法。 const不能。
  • 宏的坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换。

static局部变量和普通局部变量有什么区别

  • 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
  • static局部变量只被初始化一次,下一次依据上一次结果值;

下面就看下const,static,extern定义和简单使用

一、关于const

1. const简述*

  • const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。它限定一个变量不允许被改变,产生静态作用。
    const的作用和宏是很类似的,其实,苹果是不推荐我们使用宏的,它更喜欢我们使用const,在swift中宏就被抛弃了,我们只能使用const。

2. const有两个作用:

  • 修饰右边的基本数据变量和指针变量;

  • 被const修饰的变量只读,也就是只能获取,不能修改。

3. const的使用场景:

  • 修饰全局变量 ==>全局只读变量 ==> 代替宏

  • 修饰方法中的参数

二、关于static

static有两个作用:

    1. 修饰局部变量:
    • 存储区由栈变为堆得静态存储区,生存期为整个源程序,可以延长生命周期,生命周期跟整个应用程序一致;
    • 作用域仍为局部作用域, 只能在定义该变量的函数内使用。
    • 只初始化一次, 只会分配一次内存。
    1. 修饰全局变量:
    • 全局变量本来就是堆中的静态区, 生命周期没有改变
    • 作用域会修改, 只能在当前文件下使用
    • 好处就是: 不会被其他文件所访问,修改。其他文件中可以使用相同名字的变量,不会发生冲突。

三、关于extern

上面说到static修饰的全局静态变量,作用域是声明此变量所在的文件。而extern恰恰相反, extern修饰的全局变量默认是有外部链接的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern声明全局变量,就可以使用这个全局变量了。

1. extern简述

extern修饰全局变量的声明。以表示变量的定义在别的文件中。一般情况下默认,定义的全局变量都带有extern。

2. extern作用:

  • 仅适于修饰全局变量,不能去修饰其他的变量
  • 只是用来获取全局变量, 不能定义变量
  • 置于变量前,以表示变量的定义在别的文件中。
    • 就是说,我们在一个类中定义了全局变量NSString *name = @"hello world!"。但是想在别的类中使用这个全局变量, 无需引入头文件,只需要通过extern NSString *name;(并没有分配内存的),就可以获取到相应的全局变量进行后续操作。
    • 注意使用extern NSString *name;获取的变量name的定义只能出现一次。

3. extern工作原理:

  • 先会去当前文件下查找有没有对应全局变量,如果没有,才会去其他文件查找。

所以注意: 任何情况下全局变量都是不安全的! 随时可能会被别人改掉。这是重点, 重点, 重点 ! ! !

四、实际应用

在项目开发中我常常这样用到

static NSString *kActivity = @"这是全局Activity";
static const NSString *encryDESkey = @"这是全局只读的秘钥12345678";
static const NSInteger kTextFeildTag = 07161547;
const CGFloat PAI = 3.14;

开发中常用static修饰全局变量, 只是改变作用域, 防止重复声明全局变量。但有些是不希望外界改动,只允许读取的, 就可以通过static与const联合使用达到目的。

static与const联合使用的作用:*

  • 声明一个只读的静态全局变量

static const联合使用修饰变量和宏#define定义的比较

  • 相同点
    • 都不能再被修改, 一处修改,其它都改了
  • 不同点
    • static const修饰变量只有一份内存
    • 宏定义,只是简单的替换,每次使用都需要创建一份内存

所以, 使用static const修饰更加高效,在同一个文件内可以使用static const取代#define

上面只是简单说了下const,static,extern关键字的作用及特点, 网上有很多关于这些的详细介绍, 也搜集了一些, 有兴趣研究的可以看看。

五. 关于static关键字的面试题

(来源于网络)

static全局变量与普通的全局变量有什么区别

  • 全局变量(外部变量)的声明之前再冠以static 就构成了静态的全局变量。
  • 全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
  • static全局变量只初使化一次,防止在其他文件单元中被引用;

区别在于: 非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

static局部变量和普通局部变量有什么区别

  • 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
  • static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数有什么区别 (C语言中)

  • static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
  • static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

推荐链接:
const extern static 终极指南
如何正确使用const,static,extern
【如何正确使用const,static,extern】|那些人追的干货

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容