当前位置: 首页 > news >正文

【学习笔记】头文件中定义函数出现重复定义报错

目录

  • 错误复现
  • 原因
  • 解决方案
    • inline
    • static
  • 扩展
  • 参考

错误复现

现在有一个头文件 duplicate_define.h 和两个源文件 duplicate_define_1.cppduplicate_define_2.cpp

两个源文件都引入了头文件 duplicate_define.h,且在各自的函数中调用了定义在头文件中的全局函数 duplicateFunction()

头文件中添加了 #pragma once 来方式头文件重复包含。
在这里插入图片描述
现在如果进行编译链接操作,会出现报错,我们以 vs 为例看一下具体的报错内容
在这里插入图片描述

原因

工程在编译时,每个编译单元(简单来说就是源文件以及引入的头文件构成了编译单元)都会引入头文件,也就是说 duplicate_define_1.cppduplicate_define_2.cpp 都在各自组成的编译单元中,引入(复制一份)了头文件 duplicate_define.h

这导致每个编译单元都定义了相同的函数,也就是位于头文件中的 duplicateFunction(),而在链接时就会发现重复的函数。

解决方案

inline

inline 关键字赋予了函数“允许重复定义”的特性。在链接阶段,链接器从重复的 inline 函数中选择一个,而忽略其他副本。
在这里插入图片描述
当头文件中的函数定义为 inline 后,可通过编译。

static

static 关键字会改变函数和变量的链接属性,默认情况下全局变量和函数是外部链接,也就是它们可以被其他编译单元使用。

但一个添加了 static 的函数或变量只在它定义的编译单元中可见,这样,每个包含类似上面头文件的源文件都独立拥有 duplicateFunction(),在链接时互不冲突。

但正是因为独立拥有,所以浪费了空间。

扩展

如果在公共头文件中定义类成员函数,为什么这个类成员函数在其他多个 cpp 中被调用时不会出现上述重复定义的问题呢?

答案很简单,因为类成员函数隐含就是内联的。

参考

  1. Header file contains function body, will lead to duplicated definition?
  2. 链接器工具错误 LNK2005

相关文章:

  • 5G_WiFi_CE_DFS
  • 嵌入式---电机分类
  • 用流量和用wifi的ip地址一样吗?深度解读
  • 深入解析 KaiwuDB 源码:架构设计与核心模块实现
  • SQL注入攻击样例数据参考(全场景分类解析)
  • 一组可能的机器学习问题列表
  • Python中的eval()函数详解
  • 【蓝桥杯】单片机设计与开发,第十二届
  • leetcode:2839. 判断通过操作能否让字符串相等 I(python3解法)
  • 小白学习java第12天:IO流之转换流
  • redis itheima
  • set 的 contains
  • C++(20)—类和对象(下) ⑤内部类
  • MQTT协议:IoT通信的轻量级选手
  • 无锡无人机超视距驾驶证怎么考?
  • 【Linux】ubuntu环境变量配置以及shell配置文件编写
  • Gson、Fastjson 和 Jackson 对比解析
  • WebChat 一款非常好用的浏览器侧边栏 AI 问答插件
  • C_内存 内存地址概念
  • 【Go】windows下的Go安装与配置,并运行第一个Go程序
  • 昆山哪里有人做网站/国产长尾关键词拘挖掘
  • 建设银行官网招聘网站/摘抄一篇新闻
  • 沈阳专门代做网站的/个人网站设计毕业论文
  • 德州制作网站哪家最专业/站长统计幸福宝
  • DW怎么做招聘网站/东莞网站建设最牛
  • 珠海网站建设解决方案/东莞企业网站排名