美文网首页iOSiOS开发记录iOS Blog
ios开发—const与预处理编译

ios开发—const与预处理编译

作者: 没阳光的午后 | 来源:发表于2015-12-12 11:40 被阅读629次

    1.const与预处理编译的区别

    • 宏在编译之前处理,const是编译阶段
    • 宏不做检查,不会报编译错误,只是替换,const会编译检查,会报错
    • 宏能定义一些函数,方法,const不能
    • 使用大量宏会容易造成编译时间久,每次都需要重新替换
      注意:有些blog说大量使用宏会消耗很多内存,验证发现宏定义的只是常量,常量都放在常量区,只会生成一份内存,不存在会消耗很多内存

    2.const作用

    • 用来修饰右边的变量为只读
    // const修饰b为只读
    int const b = 20;
    // const修饰*p为只读
    int const *p;
    

    3.static和extern简单使用

    • static作用
      • 修饰局部变量:
        1.延长局部变量生命周期,程序结束才会销毁
        2.局部变量只会生成一份内存,只会初始化一次
      • 修饰全局变量:
        1.只能在本文件中访问,修改全局变量的作用域,生命周期不会改
    • extern作用:
      • 只是用来获取全局变量的值,不能定义变量,编译器会报错

    4.static和extern与const的联合使用

    • static和const使用
      1.声明一个只读的静态变量,用来代替宏来定义一个经常使用的字符串常量
      2.事实上,这样修饰的变量,编译器不会创建符号,而是会像预处理指令一样,将所有遇到的变量都替换为常量,但是这样定义的常量有类型信息
    • extern和const使用
      1.声明一个全局变量,便于在多个文件中使用
      2.这样定义的变量会放入"全局符号表"中,所以定义名字时最好加入类名,防止冲突
      3.最好将定义的全局变量放入一个专门用于定义全局变量的头文件

    总结

    • 不要用预处理指令定义常量,这样定义出来的常量不含类型信息.而且如果有人重新定义了常量值,也不会报错,会导致程序中的常量值不一致
    • 在实现文件中使用static const来定义常量.由于常量不在全局符号表中,所以无须加入类名
    • 在头文件中使用extern来声明全局变量,并在相关实现文件中定义其值.因为会出现在全局符号表中,所以名称应加入类名

    还在学习中,略有错误请指出,谢谢!!

    相关文章

      网友评论

      • 5059420aa12b:如果说定义一个宏#define age 10,然后NSLog(“%@”,age),在编译之前所有的age都会被替换成10,这个时候10是字面量,会分配一份零时内存,如果打印很多次,就会有很多份不同的零时内存,这就是为什么宏会消耗内存的原因,因此相对const性能就稍微差点
      • 华南犀牛:一度怀疑曾是机器人,。。楼主总结的不错!!
        没阳光的午后:@HansRove 啥机器人...
      • 曾樑::+1::+1:
        不超过三种颜色:@MacChark 哈哈 简书官方点赞员
        visual_:@曾樑 兄台是专业点赞啊 哪篇文章都有你的赞:sweat:
        没阳光的午后:@曾樑 好快 :joy:

      本文标题:ios开发—const与预处理编译

      本文链接:https://www.haomeiwen.com/subject/ujwyhttx.html