在大一学习的时候,只学习了C语言的基本的语法,并没有学习和使用过static、external等关键字,所以现在总结一些以前没有用到或很少用过的知识点。
一.存储类型的基本概念和static修饰局部变量的用法
变量的存储类型是指存储变量的内存类型。有三个地方可以存储变量:普通内存、运行时堆栈、硬件寄存器。
普通内存:凡是在代码块之外声明的变量总是存储于静态内存中,在程序的整个执行期间始终存在。
运行时堆栈:在代码块内部声明的变量默认存储于堆栈中,当程序执行到声明代码块时被创建,离开块被销毁。如果该代码块被数次执行,这些变量每次将会被重新创建。
硬件寄存器变量暂时不需要考虑。
如果想要在代码块内部声明的变量在离开代码块后不会被销毁,下一次执行还要继续使用,可以在变量的声明中加入static关键字。一个例子:
#include <stdio.h>
void Func();
int main()
{
Func();
Func();
Func();
system("pause");
return 0;
}
void Func()
{
static int a = 0;//执行结果 1 、 2 、 3
//int a = 0; // 执行结果 1 、 1 、 1
a += 1;
printf("%d\n" , a);
}
上面的代码中加入static的声明的变量,在离开代码块再次进入代码块依然被保留。
总结:static关键字在代码块内部用于变量的声明时,static关键字用于修改变量的存储类型变为存储在静态内存中的静态变量。
注意:虽然修改了变量的存储类型,但没有改变局部变量的作用域,依然不能再其他代码块中使用这个变量,只能在当前代码块中访问。
二.链接属性的基本概念和static、extern修改链接属性的用法
上面第一条中的static的一种用法只能修饰在代码块内部的局部变量,改变其存储类型,static关键字还有其他的用法。
标识符的链接属性决定如何处理在不同文件中出现的同名标识符。链接属性一共三种 external(外部)、internal(内部)、none(无)。
一般来说函数、全局变量的链接属性是external。
static关键字可以将链接属性由external改变为internal,使全局变量和函数为当前源文件私有。其他文件中也有同名的变量和这个私有的无关。static关键字只对缺省为external的标识符生效。
extern加在变量(全局变量)或函数的声明前,表示“这个变量或函数在别处定义,要在此处引用”。
函数和全局变量的声明不加extern也可能可以正确地引用,但是最好还是加上extern。
三.总结
extern:用于声明变量(函数)告诉编译器,这个变量(函数)在其他地方有定义。
static:1.修饰局部变量,改变变量的存储类型,使其在整个程序执行期间始终存在。
2.修饰全局变量,改变变量的链接属性,由external改为internal,使其只能在当前源文件使用。
3.修饰函数:同上。