extern关键字的两个基本作用
1、当一个变量的声明不在文件的开头,在它声明之前的函数想要引用的话,则应该用extern进行“外部变量”声明。
下面用一个简单的程序介绍extern关键字的这种用法,我们知道有这么回事就够了,只要能够看懂别人这样写就行了,自己写程序的时候就不要这么写了。
#include <reg52.h> //包含特殊功能能寄存器定义的头文件
sbit LED=P0^0; //位地址声明,
void main ()
{
extern unsigned int i; //定义无符号整型变量i
while(1)
{
LED=0; //点亮小灯
for(i=0;i<30000;i++); //延时
LED=1; //熄灭小灯
for(i=0;i<30000;i++); //延时
}
}
unsigned int i;
…… //此处省略后面的代码,只是为了说明extern关键字的用法,不建议是用这种方式声明变量
变量的作用域,是从声明这个变量开始往后所有的程序,如果我们调用在前,声明在后,那么就是使用的这种用法。但是实际开发过程中,我们一般都不会这样做,所以仅仅是表达一下extern的这个用法,但它并不实用。
2、在一个工程中,我们为了方便管理和维护代码,用了多个.c源文件,如果其中一个main.c文件要调用Lcd1602.c文件里的变量或者函数的时候,我们就必须得在main.c里边进行一下外部声明,告诉编译器这个变量或者函数是在其它文件中定义的,可以直接在这个文件中进行调用。
#include <reg52.h> //包含特殊功能能寄存器定义的头文件
unsigned char step=0; //操作步骤
unsigned char oprt=0; //运算类型
signed long num1=0; //操作数1
signed long num1=0; //操作数2
signed long result=0; //运算结果
unsigned char T0RH=0; //定时器T0重载值的高字节
unsigned char T0RL=0; //定时器T0重载值的低字节
void config_timer0(unsigned int ms); //配置定时器T0函数的声明
extern void key_scan(); //按键扫描函数的声明
extern void key_driver(); //按键驱动函数的声明
extern void init_LCD1602(); //LCD1602初始化函数的声明
extern void LCD_show_str(unsigned char x,unsigned char y,unsigned char *str); //LCD1602显示字符函数的声明
extern void LCD_area_clear(unsigned char x,unsigned char y,unsigned char len); //LCD1602区域清除函数的声明
extern void LCD_full_clear(); //LCD1602清屏函数的声明
void main ()
{
EA=1; //开总中断
config_timer0(1); //配置定时器T0定时1ms
init_LCD1602(); //初始化液晶
LCD_show_str(15,1,"0"); //初始时液晶显示数字0
while(1)
{
key_driver(); //调用按键驱动
}
}
…… //此处省略后面的代码,只是为了说明extern关键字在多个.c文件之间调用的用法