一、const详解
*如果试图修改由const修饰符修饰所声明的变量,编译器会报错。*
const修饰符修饰的指针:
- const int *p 和 int const *p
指针p的指向可以改变,但p指向的内容不可以改变。
const int *a;
int b;
a = &b;
*a = 100;//(编译报错)
- int *const p;
指针p的指向不可以改变,但p指向的内容可以改变。
int *const a;
int b;
a = &b;//(编译报错)
*a = 100;
- const int *const p;
指针p的指向不可以改变,p指向的内容也不可以改变。
int b = 100;
const int *const a;
a = &b; //(编译报错)
*a = 100;//(编译报错)
结论:const修饰的不能改变。
二、static
static修饰符修饰的变量意味着该变量仅在定义此变量的编译单元(oc中的.m文件)内可见。假如声明变量时不加static,编译器会为它创建一个“外部符号”(external symbol),如果两个编译单元内拥有同名的变量,编译器会抛出一条错误信息。实际上,如果一个变量同时声明为static const,编译器根本不会创建符号,此时会跟#define预处理命令一样。
在实现文件使用static const 来定义只在编译单元内可见的常量。(未在全局符号表中)
三、extern
如果要公开某个常量、声明一个外界可见的常值变量。此类常量需要防止“全局符号表”(global symbol table)。
定义方式: 常量在头文件中声明,在实现文件里定义。
//header file
extern NSString *const externValue;
//implementation file
NSString *const externValue = @"VALUE";
在头文件中使用extern 声明全局常量,并且在相关实现文件中定义其值。(全局符号表中)