1、
/*文件1*/
1 #include"f2.h" 2 #include<stdio.h> 3 int j=4; 4 int f1(int m,int k){ 5 int f; 6 if(n)//为什么可以直接用n?因为在编译连接时,f2.h文与main.c源文件链接,出现在main.c之前,可以这样说,对于链接的所有文件中,源文件在链表尾部,也就是说全局变量n在f1()函数前就已经定义了。 7 n=k*n; 8 j=m+j; 9 f=n%j; 10 return f; 11 } 12 13 int main(){ 14 15 int k,m,j; 16 extern int n; 17 extern int f2(int,int); 18 k=4; 19 m=3; 20 j=0; 21 printf("p1=%d\n",f1(n,m)); 22 printf("p2=%d\n",f2(k,m)); 23 printf("p3=%d\n",f1(n,j)); 24 printf("p4=%d\n",f2(n,j)); 25 printf("n=%d\n",n); 26 printf("j=%d\n",j); 27 return 0; 28 }
/*文件2 f2.h*/
1 int n=2; 2 int f2(int a,int b){ 3 static int m; 4 extern int j; 5 n=n*j+1; 6 j=j+m+1; 7 m=n+j+a+b; 8 return m; 9 }
运行结果:


主要考察全局变量(有两种类型:static和extern)和局部变量作用域
全局变量:在函数外部定义的变量称为全局变量。全局变量的作用域是从该变量定义的位置开始到整个源文件结束止。若全局变量中的局部变量同名,则在该函数中,这个全局变量被屏蔽,在该函数内,访问的是局部变量,与同名的全局变量不发生任何关系。可以跨越几个编译单位使用
局部变量:在函数内部或者复合语句内定义的变量称为局部变量,也称为内部变量。局部变量的作用域是定义该变量的函数或复合语句,在其他范围内无效。一般地,局部变量只有定义,没有声明,因为局部变量不能跨越几个编译单位使用。
static局部变量:
③
static局部变量
当在函数体(或复合语句)内部static来定义一个变量时, 称该变量为静态局部变量。静态局部变量的作用域与auto、 register类型的变量一 样,但它与这两种变量有两点本质上的区别:
●在整个程序运行期间,静态局部变量在内存的静态存储区中占据着永久性的存储单元。即使退出函数以后,下次再进入该函数时,静态局部变量仍使用原来的存储单元。由于并不释放这些存储单元,因此这些存储单元中的值得以保留。因而可以继经使用存储单元中原来的值。由此可见,静态局部变量的生存期一直延长到程序运行结束。
●静态局部变量的初值是在编译时赋给的,在程序执行期间不再赋初值.对未赋初值的静态局部变量,C编译系统自动给它赋初值0。
(2)全局变量的存储类别
全局变量有如下几种存储类别。
①static全局变量
当用static定义全局变量时,该变量称为静态局部变量。静态局部变量只限于本编译单位使用,不能被其他编译单位所引用。
②extern全局变量
在全局变量之前加上extern的作用有两种:
●在同一编译单位内用extern说明符来扩展全局的作用域。全局变量定义之后,引用它的函数在前,应该在引用它的函数中用extern对此全局变量进行声明,以便通知编译程序,该变量是一个已在外部定义了的全局变量,已经分配了存储单元,不需要再为它另外开辟存储单元。
●在不同编译单位内用extem说明符来扩展全局变量的作用城。一个C程序总是由许多函数组成,这些函数可以分别存放在不同的源文件中,每个源文件可以单独编译.这些可以单独编译的源文件称为“编译单位”。每一个程序由多个编译单位组成,并且在每个文件中均需要引用同一个全局变量时,这样为了防止变量名重复定义,应在其中一个文件中定义所有的全局变量,而其他用到这些全局变量的文件中用extern对这些变量进行声明,表示这些变量已在其他编译单位中定义,通知编译系统不必再为它们开辟存储单元。