今天在复习C的时候,看到关于#include语句的一个解释,若是B 中 #include A,就是将文件A拷贝到#include A的位置中。函数
根据这个原理,因而作了一个实验。在头文件中定义一个变量(非静态变量),同时声明一个fun函数。再写一个fun.c文件,fun.c文件中实现了fun函数,最后写一个main.c文件调用fun函数。spa
三个文件的源代码以下:code
test.h #include <stdio.h> #include <stdlib.h> void fun(); int com;
fun.c #include "test.h" void fun(){ com = 0; }
main.c #include "test.h" int main(){ com = 4; fun(); printf("%d\n", com); return 0; }
, 很明显在连接的时候必然会出现“multiple definition of `com'”。通常而言也不会在头文件中定义变量和函数。只能够声明变量,好比使用static能够在头文件中声明变量。以下所示:orm
test.h #include <stdio.h> #include <stdlib.h> void fun(); static int com;
其余两个文件不作改动,编译、连接和运行都没有报错,输出结果是4. 由于静态变量存储静态存储区,可是静态变量的做用域是一个文件,fun.c, main.c都会为com定义一个本地变量,所以,fun对com的改动不会影响main中的com. 若是但愿在fun.c中的改动对main有效果,可使用extern. ip
test.h test.h #include <stdio.h> #include <stdlib.h> void fun(); extern int com;
main.c #include "test.h" int com; int main(){ com = 4; fun(); printf("%d\n", com); return 0; }
fun.c 无须改动,此时,程序的输出结果是0。作用域
总结如下:extern变量能够声明一个外部变量,使得编译顺利用过,可是在连接以后才获得实际的变量。每个文件中定义的静态变量都会在静态存储区中分别分配一个空间,静态全局变量的做用域是该文件。在头文件中通常不会直接定义变量和函数,仅仅做声明。it