美文网首页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