一、变量的声明和定义
1.对于函数而言,因为函数包含声明和执行语句两部分,因此,声明指的是函数原型,即”函数头“,而定义则是函数体。
2.对于变量而言,如int a;,这个可以说是声明,也可以说是定义,而像extern a;这样的形式,那么这显然是一个外部变量的声明,可见声明包含了定义,这两种不同情况的根本原因是int a在出现的时候系统就给分配了内存,而extern a;出现系统并未给它分配内存。因而我们可以这样来区分:把建立了存储空间的声明称为定义,而把不需要建立存储空间的声明称为声明。
对一个变量的定义须指定两种属性:数据类型和存储类别,如static int a;
二、变量的存储类别
从作用域可分为局部变量和全局变量,局部变量包括函数的形参及函数内定义的变量,全局变量则是在函数体外定义的变量。
从生存期可分为静态存储方式和动态存储方式,包含自动(auto),静态(static),寄存器(register)和外部(extern)四类。
1.auto变量
指函数中的局部变量,定义时一般可省略auto,动态存储。
2.static变量
在局部变量前加static,则变为静态存储,函数执行后变量的内存和数据还在直到程序终止;
在全局变量前加static,则表明对于有多个不同源文件的程序,该变量只能在本文件中起作用,其他源文件不能调用它,静态存储。
3.register变量
将局部变量存储在寄存器中以提高运行速率,动态存储。
4.extern变量
在单文件程序中,可以作为变量声明;
在多文件程序中,可以用来引用其他文件中定义的变量。
是全局和静态存储变量。
一般地,对于某个文件中的extern变量,先在编译时在本文件里找外部变量的定义,如果找到,就在本文中扩展作用域,如果找不到,则在连接时从其他文件里找,如果找到,就将作用域扩展到本文件,否则报错。