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

Arm开发板+Qt学习之路-multiple definition of

问题描述:
在一个头文件a.h中定义一些变量x,在其他.c文件中(b.c,c.c)要用到。
用一般的全局变量的方法,
编译时总是提示error:multiple definition of x

问题分析:
orz,我找了好久,具体原因到现在还不知道,只是有人说全局变量的定义不要放在头文件里面。
看来回头要好好学习一下基础了。

解决方法:
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变化.

另外还有一个小文章里面提到加const可以实现,但是我的程序里面不可行,也想不明白原理。
明白的给的答复哈……
原文地址 http://shanyang262.blog.163.com/blog/static/67422201022184145985/

 
 还有一个偶然找到的方法,将定义的变量放到.cpp文件中,可以解决此问题

转载于:https://www.cnblogs.com/vector-wei/p/5566865.html

相关文章:

  • 清除windows系统垃圾文件简易脚本(bat)
  • 1225 八数码难题
  • ES6初探,什么是ES6
  • who命令
  • Android 采用Layout Inflater创建一个View对象
  • VS 类快捷键
  • /etc/motd and /etc/issue
  • java中的异常处理机制_函数覆盖时的异常特点
  • 关于狄克斯特拉算法(dijkstra)总结
  • CSS3实现两行或三行文字,然后多出的部分省略号代替
  • 函数与类
  • DT时代,哪些企业可以成为大数据公司?
  • linux诡异的半连接(SYN_RECV)队列长度
  • Linux静态库和共享库
  • 【Objective-C】04-第一个OC程序解析
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 3.7、@ResponseBody 和 @RestController
  • CSS实用技巧
  • HashMap剖析之内部结构
  • Just for fun——迅速写完快速排序
  • k8s如何管理Pod
  • Linux中的硬链接与软链接
  • SQLServer之索引简介
  • vue-cli3搭建项目
  • webgl (原生)基础入门指南【一】
  • windows下mongoDB的环境配置
  • 从零搭建Koa2 Server
  • 反思总结然后整装待发
  • 深入浅出Node.js
  • 微信开放平台全网发布【失败】的几点排查方法
  • 携程小程序初体验
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • # 飞书APP集成平台-数字化落地
  • #vue3 实现前端下载excel文件模板功能
  • $jQuery 重写Alert样式方法
  • $refs 、$nextTic、动态组件、name的使用
  • (30)数组元素和与数字和的绝对差
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (算法)Travel Information Center
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)平衡树
  • (轉貼) UML中文FAQ (OO) (UML)
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .sdf和.msp文件读取
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [1127]图形打印 sdutOJ
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [android] 看博客学习hashCode()和equals()
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现