multiple definition of `xxxx`问题解决(vscode开发stm32)

一、背景

开发时遇到如下问题:

在Tim.h文件夹中定义了一个结构体变量

TIM_HandleTypeDef htim2;//定时器实例变量

其余的文件在引用此变量时都加上了#include "Tim.h"

但编译时,终端报错:

multiple definition of `htim2'

全局搜索下来,只有Tim.h文件夹中定义了此结构体变量

最终在炸鸡叔的博客中找到了答案,原文:

multiple definition of `xxxx`问题解决及其原理_multiple definition of `g-优快云博客

二、解决方案

仅需在.c文件中定义变量,再在.h文件中声明一个外部链接(使用extern关键字),如下:

.c文件:
TIM_HandleTypeDef htim2;


.h文件:
extern  TIM_HandleTypeDef htim2;

.h文件不要忘记加上“头文件防护”:

#ifndef __XX_H__

#define __XX_H__

#endif

三、原理

头文件(.h文件)中直接定义了全局变量或静态数据成员(X),而这个头文件被多个源文件(.c

文件)包含(.c文件最上面的#include xxx.h)。

在每个源文件中,编译器都会为这个变量生成一个定义,即每个源文件都会创建一个自己的变量

(X)副本。

尽管它们在源文件层面看起来是独立的,但链接器在将所有目标文件链接成一个可执行文件时会看

到多个同名变量定义,从而引发错误。

但是当使用 二 中所指的解决方案后,由于extern关键字的使用,指示了变量(X)定义位于程序的

另一部分(通常是在另一个源文件中),从而允许在当前文件中声明而不实际分配存储空间。

如果这篇博文对您有帮助,不妨点赞关注喔~        :)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值