一、const与宏的区别
处理时刻
:宏是预处理时(即在预处理时把宏展开,替换为原来的值, 没有类型,不做类型检查),const是编译运行时(编译器在编译时会检查错误,程序在运行时,从内存(堆或栈)中读取)编译检查
:宏不会编译报错,const会报编译错误- 宏能定义一些函数,方法。 const不能。
宏不会开辟新的内存空间 ,而是存放在常量区
, 所以大量使用宏,会使编译时间太久,因为每次编译都需要替换, 并且导致二进制文件变大
二、const的用法
1.修饰基本数据类型 (两种方法是一样的)
int const a = 1;
const int b = 2;
a = 3; // 报错: Cannot assign to variable 'a' with const-qualified type 'const int' 无法为具有const限定类型“const int”的变量“a”赋值
b = 3; // 报错: Cannot assign to variable 'b' with const-qualified type 'const int'
2.修饰指针类型 (const只修饰右边的变量)
int a = 1;
int b = 2;
int *const p = &a;
*p = 30;
p = &b; // 报错: Cannot assign to variable 'p' with const-qualified type 'int *const'
指针指向的地址无法改变,但是可以通过指针改变指向地址说保存的值
; const右侧是p , 所以p 的值不可以修改, 但是*p 就可以修改.
int a = 1;
int b = 2;
int const *p = &a;
*p = 30; // 报错: Read-only variable is not assignable 只读属性不能被赋值
p = &b;
指针指向的地址可以改变,但是无法通过指针改变指向地址说保存的值
; const右侧是p , 所以p 的值不可以修改, 但是p 就可以修改.(int const *p
和const int *p
效果一致)
- const同时在指针符号两边
int a = 1;
int b = 2;
int const * const p = &a;
*p = 30; // 报错: Read-only variable is not assignable
p = &b; // 报错: Cannot assign to variable 'p' with const-qualified type 'const int *const'
指针指向的地址不可以改变,同时无法通过指针改变指向地址说保存的值
; *p和p 都不可修改
- static与const联合使用
- 声明一个只读的静态
变量
: 了防止重复声明全局变量。 在开发中声明的全局变量,有些不希望外界改动,只允许读取。这时就需要两者一起使用.- 声明一个静态的全局只读
常量
: 比如一个基本数据类型不希望别人改动 // static const int a = 10.- 也可以用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量.
- extern与const联合使用
在多个文件中
经常使用的同一个字符串常量, 比如系统的通知的key 的设计
UIKIT_EXTERN NSString *const UITableViewSelectionDidChangeNotification;
- static与const组合:在每个文件都需要定义一份静态全局变量。
- extern与const组合:只需要定义一份全局变量,多个文件共享。
// extern + const 的使用
//.h文件声明
extern NSString * const string;
//.m文件定义
NSString * const string = @"string";
.End
网友评论