全局变量:不管是经典的还是普通的,就是一条规矩:不要在头文件里定义变量,局部变量也不要。
如:delay.h中定义的int i;
如果delay.c中包含的delay.h,在其他的文件中也包含的delay.h,那么就出现重复定义,解决方法在delay.h中将 extern int i; 定义外部申明变量,然后在需要用.c文件中定义。如 delay.c 中定义int.i;
这就是声明和定义的区别;
定义是要具体分配内存的,而声明仅仅是告诉编译器,当遇到声明的变量时可以到其它文件查找。
比如有两个文件A.c和B.c,在A中定义了一个全局变量int i,在B中也定义该变量,那么在连接时就会出现重复定义的错误。但是B中也需要A中的i这个全局变量,所以要在B中用extern int i;进行声明,再使用,这时连接的时候,遇到i就会自动到A中去找。
extern关键词在函数声明的时候,可以省略,所以在使用时要区分是定义还是声明。下面是对全局变量使用的一些建议:
1.全局变量要少用,能不用就不用;
2.在主程序外面只对全局变量做声明,不做定义;
3.使用中断时,要加上使用的寄存器组;
4.裸露的全局变量全部用结构体封装起来;
5.中断与主程序共享全局变量,用函数(含临界段)封装起来;
6.使用全局变量出错时,可以给它指定一个地址(注意:不要和当前使用的寄存器组发生冲突);
7.将大部分全局/静态变量(特别是数组)定义到xdata段中;
8.有些变量可能会随时改变,例如:在中断中赋值的变量,以及硬件修改的输入/输出寄存器等,在程序中使用这些变量时,最好加上“volatile”关键词,告诉C51编译器:
(1)不要优化该变量,例如相连的两个相同的赋值语句,第二个不要优化掉,因其处于不同“时刻”赋值结果可能不一样。
(2)每次取该变量值时要从其实际地址的寄存器取,不要从内存的副本中取,因其值可能随时比改变了。