const有条原则, 那就是他右边是什么, 什么就不可变, 如下
int c = 30;
const int a = 10;//a不可变
int const b = 20;//b不可变 const 和 数据类型可以互换
int const *p1 = &c;//*p1不可变, p1可变
int *const p2 = &c;//*p2可变,p2不可变
const int *const p3 = &c;//*p3和p3都不可变
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝
#define kConstant 123//定义常量宏
const int ABC = 100;//定义常量 此时并未将ABC载入ROM中
int main (int argc , const char *agrv[]){
int a = kConstant;//编译时进行宏替换,分配内存
int b = ABC;//此时为ABC分配内存,以后不再分配
int c = kConstant;//编译时进行宏替换,再次分配内存
int d = ABC;//不分配内存
}
const和define区别
编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率比宏定义要高
既然宏定义能做的事const都能做, 那宏还有什么存在的必要么?
存在即合理, 既然宏定义还没被淘汰, 那必然有它存在的道理.
宏能做到const不能办到的事.
-
宏能定义函数
-
OC的单例模式用到宏
-
宏还能根据传入的参数生成字符串
宏定义高级功能
kStringCat(x, y) // 根据传入的x和y拼接成字符串
kToString(x) // 根据传入的x生成一个字符串
kStringCat(x, y) #x#ykToString(x) #x