ios开发—const与预处理编译
2015-12-12 本文已影响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来声明全局变量,并在相关实现文件中定义其值.因为会出现在全局符号表中,所以名称应加入类名
还在学习中,略有错误请指出,谢谢!!