一、背景
开发时遇到如下问题:
在Tim.h文件夹中定义了一个结构体变量
TIM_HandleTypeDef htim2;//定时器实例变量
其余的文件在引用此变量时都加上了#include "Tim.h"
但编译时,终端报错:
multiple definition of `htim2'
全局搜索下来,只有Tim.h文件夹中定义了此结构体变量
最终在炸鸡叔的博客中找到了答案,原文:
multiple definition of `xxxx`问题解决及其原理_multiple definition of `g-CSDN博客
二、解决方案
仅需在.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)定义位于程序的
另一部分(通常是在另一个源文件中),从而允许在当前文件中声明而不实际分配存储空间。
如果这篇博文对您有帮助,不妨点赞关注喔~ :)