目录
1.extern关键字
当你使用 extern 关键字声明一个变量时,它表示该变量是在其他源文件中定义的,并且你希望在当前源文件中引用它。这使得多个源文件可以共享变量,而不会导致重定义错误。
两个文件里的变量b不能通用所以导致代码错误
引用外部符号extern,就可以正常输出变量b
2.static关键字
-
修饰局部变量:放在局部变量的前面,并将变量放在静态区,即使变量离开了作用域也不会立刻被销毁,变相的延长了生命周期。
void text() { int a = 1; a++; printf("%d\n", a); } int main() { int i = 0; while (i < 5) { text(); i++; } return 0; }
如图,输出结果全部都是2,这是因为当我们的主函数进入while循环后,要调用text函数,变量a在此被定义且赋值为1,随后a++此时a为2,故被打印出来也为2,之后跳出函数,a的生命周期结束,再次循环,再次进入函数,a再次被赋值为1,a++再打印出2,直到主函数跳出循环。
void text() { static int a = 1; a++; printf("%d\n", a); } int main() { int i = 0; while (i < 5) { text(); i++; } return 0; }
如图,我们在变量a前面加上static,我们可以理解为将变量a放入了静态区,从而使得函数的每一次结束后,变量a由于改变了存储位置而没有被销毁,因此将a每次的循环结果保留了,故我们得到了每次a变量加1的结果。
-
修饰全局变量 :我们在前面的extern中的代码看到当我们使用extern后,两个.c文件中的变量a可以互相使用,而static修饰全局变量以后,将变相缩小作用域,两个文件不在可以互通。
如图,可以看到代码是可以正常运行的.
当我们加入static后两个文件将不再相通,这就是static修饰全局变量的作用 ,作用域被限制在当前文件(text1.c)中,其他文件无法直接访问或修改它.
-
修饰函数:static在修饰函数的时候,其实和修饰全局变量的效果一样,对其中一个文件进行封装
如图代码正常运行,在text1.c中可以调用text2
里的Add函数
当我们在Add前面加上static,这个代码就无法正常运行了,这就是static修饰函数的效果。