终于明白了extern的作用

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:51   1429   0

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。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP