C语言在头文件中包含全局变量有三种形式:
1 、在头文件中声明一个全局变量,在一个C文件中定义全局变量,然后在所有的引用了这个头文件的C文件里都可以使用该全局变量值。
如在main.c定义
int a = 3;
然后定义一个main.h,那么所有引用main.h的c文件中,均可以访问a并更改其值。
2 、在头文件中定义一个静态全局变量。那么所有引用该头文件的C文件,均拥有一个作用域在本文件范围内的同名静态全局变量。不同文件中的该变量虽然同名,但却是不同的变量。
比如在a.h中定义
static int a = 3;
那么在a.c中引用a.h,并将a值修改为4。
在b.c中也引用a.h,不对a值做修改,打印a值,仍为3, 不会因为a.c中的修改而改变值。
3 、在头文件中定义全局变量。该头文件仅可以被一个C文件引用一次。
比如a.h中定义
int a = 3;
在a.c中可以引用a.h,并对a进行访问和修改。
如果在同项目下有b.c引用了a.h,编译器在链接时会报同名全局变量的错误,导致编译失败。
因为这所谓的“全局变量”只是在一个进程中全局,并不是在整个系统中全局。
所以你的“同时运行”是启动了两个进程,每个进程都有它自己的int sum
更改一个的值不影响另一个
在test2.c中,sum的值没有变过,一直是0
而test1.c中,sum每打印一次就会++,是0、1、2.....
虽然他们都是使用的头文件toto.h中的全局变量,但test1与test2是两个不同的进程,包含头文件可以理解为把头文件的内容放到test1和test2的开头,这样,相当于只是test1和test2都有一个自己的全局变量sum,两个sum之间是没有关系的
两个程序直接的变量没有关系.一个程序看不到别的程序定义的东西
extern sum; 亲,这个写法说明是在vc6++上编译的。要是其它是过不去的。
亲,你说的打印不一样,也就在这里了。因为你在别的地方定义了sum这个变量。所以你extern sum;后,这个变量的值是从别的地方拿来用的。
当你两个一起运行,printf("%d\n",sum++);这个语句会把sum的值改了,增加1。当test1.c运行完后,下在面的test2.c中sum的值也会加1;test1.c每运行一次,test2.c调用都不一样
还有你要看一下,你两个文件test1.c与test2.c在编译的时候是不是把他们都纳入进来了。这样他们就会相当于一个文件了。这就是vc6++的好处,也是一个弊端