extern,表明一个变量不是在本文件中定义的,他的定义在别的文件。以前一直不太明白为什么需要extern,什么时候需要把一个变量声明为extern。
最近编写stm32的串口程序终于明白了。
我首先编写stm32的串口1的usart.h文件,代码如下
#ifndef __USART_H #define __USART_H
#include "sys.h"
#define USART_REC_LEN 200 //定义接收的最大字节长度 #define EN_USART1_RX 1 //定义串口接收使能宏,1使能 ,0禁止 u8 USART_RX_BUF[USART_REC_LEN]; //串口接收缓冲数组 u16 USART_RX_STA; //接收状态控制标记,
void Usart_Init(u32 bound);
#endif
在这里,我把USART_RX_BUF[USART_REC_LEN]和 USART_RX_STA这两个变量定义在头文件中,然后
然后在main.c和usart.c这两个文件中都要导入usart.h这个头文件
这样编译会报错,
提示在main.c和usart.c中USART_RX_BUF和 USART_RX_STA重复定义了,因为在这两个.c 文件中都包含了 usart.h这个头文件,这样导致重复定义。
解决方法:把USART_RX_BUF[USART_REC_LEN]和 USART_RX_STA的定义放在usart.c文件中,usart.c代码如下
#include "usart.h"
u8 USART_RX_BUF[USART_REC_LEN]; //串口接收缓冲数组 u16 USART_RX_STA; //接收状态控制标记,
以下代码省略......
在main.c文件中,给这两个变量的声明前加extern,告诉编译器不要在本文件中找这两个变量,main.c文件的代码如下
#include "stm32f10x.h" #include "delay.h" #include "led.h" #include "timer.h" #include "usart.h" #include "stdio.h"
extern u8 USART_RX_BUF[USART_REC_LEN]; //串口接收缓冲数组 extern u16 USART_RX_STA; //接收状态控制标记,
以下代码省略......
编译通过。
总结:当有一个变量需要在多个文件中用到时,不能定义在头文件中,会导致重复定义,要把该变量定义在某个.c文件中,
另一个需要用到该变量的.c文件在该变量的声明前加extern。
|