终于明白了extern的作用

您所在的位置:网站首页 extern数组用法 终于明白了extern的作用

终于明白了extern的作用

2024-06-29 15:30| 来源: 网络整理| 查看: 265

      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。

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3