multiple definition of 问题解决方法

2023-05-16

在最近的项目里,由于我想重载结构体的==操作符,然而大意的我把重载的过程写在了头文件里,所以导致了multiple definition of的错误。现在总结下解决方法:

首先,最关键的,不要把全局变量以及全局方法的定义放在头文件里!!!!

1.给每一个头文件加上条件编译:
注:此方法不是解决上述问题的方法,只是解决multiple definition of的一个方法。
当多个文件包含同一个头文件时,而头文件中没有加上条件编译,就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。 
给每一个头文件加上条件编译,避免该文件被多次引用时被多次解释,这是个应该是习惯。这个方法会解决大部分低级问题。
条件编译示例
#ifndef TEST_H
#define TEST_H
……
#endif

2.使用extern定义全局变量:
可以把所有的全局变量放入一个头文件 global.h (名字随意起,但要加条件编译)中,每一个变量前面加extern,声明一下这些变量将在其它文件中定义。 然后建立一个和头文件名字对应的.c or .cpp文件 如global.c。在里面声明所有的全局变量。例如:void(*Handl_Display)();
然后,让涉及到全局变量的文件include ”global.h“。这样编译时,会先对global.c编译生成一个global.o ,然后再和其它文件的.o链接生成可执行文件。
简单一点说,就是在变量前加extern,之后变量的声明放在.c中。

 

3.使用Static修饰:
在变量前加static,声明成静止变量。
这个方法虽然可以解决multiple definition的问题,但是却会引发其他问题。
问题如下:
三个文件,a.h,a.c,b.c;
在a.c和b.c 都include了a.h。
在b.c中调用a.c中的函数对a.h中的变量进行赋值,但事实上b.c中的变量仍没被赋值。
问题分析:
static的含义是迫使那个变量只在某个文件可见。 
假定你在头文件定义static x; 
且这个头文件分别被a.c和b.c包含;
实质是在a.c和b.c里会分别定义一个名字叫x的变量,两个x毫无关系。
在a.c里修改x,他不会导致b.c里的x变化.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

multiple definition of 问题解决方法 的相关文章

  • ReactNative AsyncLocalStorageUtil is defined multiple times

    ios运行正常 xff0c 在android下运行报错如下 xff1a AS 编译报错 Type com reactnativecommunity asyncstorage AsyncLocalStorageUtil is defined
  • Multiple markers at this line @Override的解决方法

    使用Eclipse 进行项目开发 xff0c 在实现类中的方法前面如果添加 64 Override就提示 Multiple markers at this line 的错误 xff0c 问题描述如下 Multiple markers at
  • Build a Multiple Choices Cascader by ant-design-vue

    Preface I need to make a cascader which can support multiple choices However I didn 39 t find any ui which supports that
  • 【unity】Multiple plugins with the same name '...'解决方案

    Multiple plugins with the same name 39 ulua 39 found at 39 Assets Plugins uLua 1 22 x86 64 ulua dll 39 and 39 Assets Plu
  • 什么是无界数组?

    什么是无界数组 无界数组和动态分配数组有什么区别 与无界数组相关的常见操作有哪些 就像我们有堆栈数据结构的弹出和推送 无界数组可以 并且通常是 静态分配 实现无界数组时的主要关注点是提供类似动态数组的自由来在运行时决定数组大小 而不会因运行
  • 为什么编译器支持冗余作用域限定,它合法吗?

    我在两个编译器上进行了测试 并惊讶地发现两者都支持以下内容定义无怨无悔 class A A A A A 请注意 这对于方法也是成功的 尽管当声明过度限定时会被标记 问题 这是一个有效的 C 程序吗 如果是这样 它有什么目的 或者只是一个副产
  • Git 跟踪、未跟踪、暂存、索引的含义?

    有人可以澄清这些术语的含义吗 跟踪的文件是否是在某个时刻添加到舞台中的任何文件 索引 和 阶段 一样吗 是否跟踪所有暂存文件 但反之则不一定成立 即 曾经暂存并提交的文件 但不是要提交的当前阶段的一部分 我如何知道哪些文件被跟踪 我如何知道
  • PHP 中“?”、“()”和“:”符号的含义是什么?

    我终于想起来要问什么了 我从来没有真正得到什么 和 当像这样定义变量时执行以下操作 ip SERVER HTTP X FORWARDED FOR SERVER HTTP X FORWARDED FOR SERVER REMOTE ADDR
  • 为什么在C语言中可以定义一个变量两次?

    我一直在测试全局变量 定义和声明 但我在这种情况下停了下来 main c include stdio h void func void int a int main void a 20 printf in main d n a func r
  • Coq:定义子类型

    我有一个类型 比如说 Inductive Tt a b c 定义它的子类型的最简单和 或最好的方法是什么 假设我希望子类型仅包含构造函数a and b 一种方法是对二元素类型进行参数化 例如布尔 Definition filt x bool
  • 如果我在标头中声明命名空间,是否可以避免在 .cpp 文件中使用类名? [复制]

    这个问题在这里已经有答案了 在 C 中 我想做的就是声明一个DisplayInfo类在一个 h文件 然后在 cpp文件 不必输入第一个DisplayInfo DisplayInfo 以及每个函数的定义 遗憾的是 我已经查看了 20 多个主题
  • “干净代码”的定义[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 罗伯特 C 马丁在他的书的第一章中提出 干净的代码 https rads stackoverflow com amzn click com 01
  • “编译时”和“运行时”有什么区别?

    我不明白术语 编译时 和 运行时 或 运行时 的含义 我也对 值类型 和 引用类型 的含义以及它们与上述 时代 的关系感到有点困惑 有人可以解释一下这些事情吗 编译时 是指构建代码的时间 编译器将源代码转换为 IL 的时间 运行时 是指执行
  • 什么是代码洞,代码洞有合法用途吗?

    我第一次遇到这个词是在 StackOverflow 的问题 C 理论 将 JMP 写入 asm 中的 codecave https stackoverflow com questions 787006 我看到根据维基词典 http en w
  • 单一责任原则的例子是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有人可以给我一个单一责任原则的例子吗 我试图理解在实践中 一个班级承担单一责任意味着什么 因为我担心我可能每天都会违反这条规则 破坏应
  • 注解:通过注解限制对类的引用

    我认为这是不可能的 但也许我错了 所以我问你 是否可以 如果我定义一个仅接受扩展某些接口或类的类引用的注释 这是可能的 Class
  • 里氏替换原理的例子是什么?

    我听说里氏替换原则 LSP 是面向对象设计的基本原则 它是什么 它的使用示例有哪些 说明 LSP 的一个很好的例子 由鲍勃叔叔在我最近听到的播客中给出 是有时在自然语言中听起来正确的东西在代码中却不太有效 在数学中 一个Square is
  • 方法到底什么时候会产生副作用?

    正如我一直理解的那样 对程序状态的任何更改 或与 IO 有关的任何事情 都是副作用 更改是发生在全局变量中还是发生在调用该方法的对象的私有字段中并不重要 由此可见 所有不返回任何内容的方法要么根本不执行任何操作 要么有副作用 我的困惑来自于
  • Ruby 是脚本语言还是解释语言?

    我刚刚注意到在Ruby的维基百科页面中 这种语言被定义为解释性语言 我明白我的背景中可能缺少一些东西 我一直都知道不需要编译器的解释型语言和编译型语言 需要在程序执行之前进行编译 之间的区别 但是脚本语言有什么特点呢 Ruby 可以定义为脚
  • C++ 中类定义的顺序

    我这里有点问题 我试图定义几个类 其中一些是玩家 一些是属于玩家的 Pawn 来自 Python 我习惯于能够通过 Pawn 方便地访问 Pawn 拥有的 Player 以及通过 Player 访问 Player 的 Pawn 如果我错了请

随机推荐

  • SQL server loginname alias mapping problem.

    exec sp changedbowner 39 Aambriore mra 39 EXEC sp change users login 39 Auto Fix 39 39 lts 39 null Exec sp change users
  • [ASP.NET MVC 小牛之路]08 - Area 使用

    ASP NET MVC允许使用 Area xff08 区域 xff09 来组织Web应用程序 xff0c 每个Area代表应用程序的不同功能模块 这对于大的工程非常有用 xff0c Area 使每个功能模块都有各自的文件夹 xff0c 文件
  • OpennVINS运行、评估笔记

    1 安装运行 1 1 下载 amp 编译 span class token builtin class name cd span catkin ws src span class token function git span clone
  • 关于apm飞控烧bootloader

    最近一直由于学校大创申请的的四轴 xff0c 一直在做这玩意 xff0c 哎 xff0c 无奈这货实在不像想象的那样简单 xff0c 自己写了N久飞控 xff0c 也没把飞机飞起来 xff0c 只能先用开源的apm飞控练练手呗 xff0c
  • c语言实现subs指令,周立功LPC系统移植学习之c启动代码修改一

    一 系统移植用c启动代码 Copyright c Guangzou ZLG MCU Development Co LTD graduate school http www zlgmcu com File Info
  • Google开源项目phpdoc-zh【PHP中文手册】

    为什么80 的码农都做不了架构师 xff1f gt gt gt 现在不用愁找不到好的PHP中文手册 xff0c 没乱码 xff0c 更新速度快 xff0c 翻译准确 xff01 项目地址 xff1a http code google com
  • 计算机与我的生活英语作文,描写一天的生活英语作文(通用7篇)

    描写一天的生活英语作文 通用7篇 在平凡的学习 工作 生活中 xff0c 大家都不可避免地要接触到作文吧 xff0c 作文要求篇章结构完整 xff0c 一定要避免无结尾作文的出现 相信很多朋友都对写作文感到非常苦恼吧 xff0c 下面是小编
  • reStructuredText语法简单说明

    reStructuredText 是扩展名为 rst的纯文本文件 xff0c 含义为 34 重新构建的文本 34 34 xff0c 也被简称为 xff1a RST或reST 官方网址 xff1a http docutils sourcefo
  • 优秀的程序员需要擅长数学吗?

    天有很多年轻人或经验不足的程序员 在 论坛发帖 在 Stack Exchange 网站问 xff1a 为了成为优秀的程序员 xff0c 我需要擅长数学吗 xff1f xff0c 在我还年轻的时候 xff0c 我也问自己同样的问题 最近 xf
  • datax同步MySQL数据到mongodb

    根据生产需要 xff0c 同步非实时数据到mongodb 经过同事间的不断研究 xff0c 特弄出了这样一套方案 xff1a MySQL xff08 RDS xff09 gt Datax gt mongodb 我们的mysql用的是阿里云的
  • 网络虚拟化

    网络虚拟化的内容一般指虚拟专用网络 对网络连接的概念进行了抽象 xff0c 允许远程用户访问组织的内部网络 xff0c 就像物理上连接到该网络一样 网络虚拟化可以帮助保护 IT 环境 xff0c 防止来自 Internet 的威胁 xff0
  • C语言实现wake on lan(网络唤醒)

    wake on lan是一种网络唤醒功能 xff0c 它可以实现远程开机 xff0c 刚好实验室有一台ftp服务器 xff0c 因为不是24小时开机的 xff0c 所以每次开机都要跑过去用手按开关 xff0c 非常麻烦 xff0c 于是在网
  • 裸辞2个月,找不到新工作,我这样的程序员多吗?

    如题 xff0c 年后回来毅然决然从公司离职 xff0c 离职一时爽 xff0c 此时心已凉 离职2个月了 xff0c 记不得多久以前已经找不到新公司投简历了 面试机会太少 xff0c 私活太少 快活不起了 像我这样的程序员现在多吗 xff
  • Linux驱动示例

    本文首先描述了一个可以实际测试运行的驱动实例 xff0c 然后由此去讨论Linux下驱动模板的要素 xff0c 以及Linux上应用程序到驱动的执行过程 相信这样由浅入深 由具体实例到抽象理论的描述更容易初学者入手Linux驱动的大门 一
  • 清华裴丹:AIOps 落地路线图

    AIOps概念火热 xff0c 但如何落地 xff1f 清华大学裴丹副教授在GOPS上海站的主题演讲中 xff0c 通过庖丁解牛的方式给出了AIOps落地的技术路线图 xff1b 同时提出AIOps落地战略路线图 xff0c 通过AIOps
  • JS编写冒泡函数

    function Sort arr for var i 61 0 i lt arr lrngth i 43 43 for var j 61 0 j lt arr length i 1 j 43 43 if arr j lt arr j 43
  • 从软件到片源!PC播放HDTV上手全攻略

    高清视界来临 HDTV迅速走红 随着CCTV HD节目的试播开始 xff0c HDTV这个词越来越多的在人们的生活中出现 很多人家里买了HDTV电视 xff0c 但是却感到自己收看到的节目并没有更加清晰 xff0c 甚至效果不如以前 究竟什
  • linux系统日志

    日志记录系统每天发生的各种各样的事情 xff0c 比如监控系统的状况 xff0c 排查系统的故障等 你可以通过日志来检查错误发生的原因 xff0c 或者受到攻击时留下的痕迹 日志的主要功能是审计和监测 xff0c 还有实时的监测系统状态 x
  • 怎样获取datagrid中编辑列combobox的value值与text值

    var ed 61 39 dg 39 datagrid 39 getEditor 39 index editIndex field 39 productid 39 var productname 61 ed target combobox
  • multiple definition of 问题解决方法

    在最近的项目里 xff0c 由于我想重载结构体的 61 61 操作符 xff0c 然而大意的我把重载的过程写在了头文件里 xff0c 所以导致了multiple definition of的错误 现在总结下解决方法 xff1a 首先 xff