const与define

const和#define使用

1.什么是const?
2.什么是#define?
3.有什么用?
4.区别是什么?
5.应该怎么用?

什么是const?

const 是c/c++中的一个关键字(修饰符),const一般用来定义一个常量。该常量的值不能修改。
      const int var  = 100;
      int var1 = var;
      int var2 = var;
      var = 2000;//这样会报如下错误
    //    Cannot assign to variable 'var' with const-qualified type 'const int'

什么是#define?

而define, 宏定义, 则是一条预编译指令, 编译器在编译阶段会将所有使用到宏的地方简单地进行替换

  #define kconst 1000
  int defvar1 = kconst;
  int defvar2 = kconst;
  /*
   编译后生成以下代码:
   int defvar1 = 1000;
   int defvar2 = 1000;
   */

有什么用?

  1. const和define都可以定义一个常量,都能实现只改值一次,就可以所有用上该常量的地方同步改值,一句代码也都不用改。
  2. 使代码更易维护
  3. 提高代码的效率

有什么区别?

相同点:

* 都能定义常量

不同点:

* const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,  
所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝??????????
            const int var  = 100;
           #define kconst 1000
           int var1 = var;//此时为var分配内存,以后不在分配
           int var2 = var;//不再分配内存

           int defvar1 = kconst;//编译时进行宏替换,分配内存
           int defvar2 = kconst;//编译时进行宏替换,再分配内存
  • 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量没有了存储与读内存的操作,使得它的效率比宏定义要高

既然宏定义能做的事const都能做, 那宏还有什么存在的必要么?
宏能做到const不能办到的事.
1.宏能定义函数
2.OC的单例模式用到宏
3.宏还能根据传入的参数生成字符串

该怎么用?

const有条原则,那就是他右边是什么,什么就不可变,如下:

        int a = 2;
        const int b = 100;//b 不可变
        int  const c = 200;// c 不可变,const和数据类型 位置可换
        int const *p1 =&a;//*p1 不可变,p1 可变
        int * const p2 = &a;//p2 不可变, *p2 可变
        const int * const p3 = &a;//p3 不可变,*p3不可变

const 不可变原则:
用const修饰的函数形参,则能提高代码的安全性,同时减少程序员之间的沟通成本

int add(const int * x,const int * y){
    //不能对x,y进行修改
    return *x + *y;
}

宏多用于条件编译,如需要对于不同的情况下执行不同的代码块,则可以使用宏的条件编译来进行判断

在Objective-C中, 随处可见const常量, 所以大家应该大胆地使用const, 它会带给你大大的益处. 同时, 只要某个数据是定义之后永远都不需要也不能修改的, 请使用const!


   转载规则


《const与define》 志鹏 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
OC中的拷贝 OC中的拷贝
内存的栈区 : 由编译器自动分配释放, 存放函数的参数值, 局部变量的值等. 其 操作方式类似于数据结构中的栈. 内存的堆区 : 一般由程序员分配释放, 若程序员不释放, 程序结束时可能由OS回 收. 注意它与数据结构中的堆是两回事,
2016-05-19
下一篇 
创建block姿势 创建block姿势
如何在OC中声明一个block? 作为一个本地变量:objc returnType (^blockName)(parameterTypes) = ^returnType(parameters) {...}; 作为一个属性: @proper
2016-05-17
  目录