const、static、extern三个关键字

时间:2023-03-08 23:36:50
const、static、extern三个关键字

默认情况下,C语言的全局变量是全世界都可以访问的,也就是全局变量可以跨文件访问。

extern可以引用全局变量

例如,如果有一个全局变量int money = 100;
extern int money 意为:引用这个全局变量,而非定义一个全局变量

注意:不允许出现两个变量名一样的全局变量
   函数和变量一样,都可以被全局引用

static的作用:
static 修饰的全局变量作用域仅限于当前文件 所以被static修饰的全局变量不能被引用
static修饰的局部变量只会初始化一次,在整个程序运行过程中始终存在

const : const只修饰它右边的内容,被const修饰的内容都是常量、都是不能再修改的

int * const p1; p1是常量 *p1是变量

int const * p1;  *p1是常量 p1是变量
const  int *p1;

const int *const p1; p1和 *p1都是常量
int const * const p1;

const int age = 20;
int *p = &age;
*p = 30;  不行

static :
 1> 被static修饰的全局变量\常量
    1) 仅限于当前文件访问
    2) 改变了作用域
 2> 被static修饰的局部变量
    1) 只会占用一块内存,在整个程序运行过程都不会销毁,只会初始化一次
    2) 改变了生命周期,并没有改变作用域
 
 extern : 可以引用一个全局变量\常量
默认全局变量如果没有用static修饰,全部是可被extern的(即全局可访问,但可被访问到的前提是:在其他地方访问这个全局变量必须要加extern修饰符,笔者称之为可被extern)

比如:我在A.m文件中声明并定义了一个全局变量BOOL isSelected = NO;如下图:

const、static、extern三个关键字

我如果在B.m文件中声明同名的变量BOOL isSelected = NO;会报错,截图如下:

const、static、extern三个关键字

解决这个问题的办法有两种:

第一种:A.m文件中的全局变量声明为static的,代表只能在当前文件访问(当前文件可见):static BOOL isSelected = NO;

第二种:B.m文件中用extern引用A.m文件中申明定义的这个全局变量:引用方式:extern BOOL isSelected;如下图:

const、static、extern三个关键字

采用第二种方式:代表B.m文件和A.m文件使用的是同一个BOOL类型的变量!!!如果A.m文件把isSelected 改为YES,那么B.m文件使用这个isSelected时需要注意了,此时isSelected也是YES!!!

注意:

1. 上面extern BOOL isSelected;这句代码不是声明变量,而是引用变量。

2. 一般情况下,如果其他文件中不会访问本文件中的全局变量,那么建议用static关键字进行修饰,例如:static BOOL isSelected = NO;