能不能在头文件中定义全局变量?
首先,这是一篇科普文,所以 比较杂,我尽量写清楚一些。
1、ANSI C标准是什么?GNU又是什么?ld是什么?
ANSI C是C语言的标准规范,是国际标准化组织制定的国际标准。
虽然 ANSI C规范了C语言的实现,但是在实际情况中,各家C语言提供商都会根据平台的不同情况对ANSI C进行一定的扩展。因此可以将现实中C语言实现看作是ANSI C的一个超集。比较有代表性的例子是linux的gcc编译器。由于该编译器对ANSI C进行了非常多的扩展,linux内核源码基本上只能在gcc上面 进行编译,希望通过其他的编译器来编译linux内核几乎是不可能的。
GNU计划,又称革奴计划。它的目标是创建一套完全自由的操作系统。1990年,GNU计划已经开发出的软件包括了一个功能强大的文字编辑器Emacs 。GCC(GNU Compiler Collection,GNU编译器集合),是一套由 GNU 开发的编程语言编译器。
GNU工具链包括了构建linux开发环境所需的编译、链接、调试、软件工程等工具。GCC(编译器)、Gdb(调试器)、make(软件等工程工具)。GCC下包括gcc,g++工具。GNU binutils是一组二进制工具程序集,是辅助GCC的主要软件,包括我们熟悉的as(GNU汇编器),ar(建立、修改、提取归档文件,归档文件是包含多个文件内容的一个大文件)、ld(连接器,把目标文件和归档文件结合在一起),我们在写程序的时候,有时候报错:[Error] ld returned 1 exit status,这就是程序在链接的时候出错了。
2、C语言可以在不同的源文件中定义相同名字的全局变量吗?
不使用static的时候,两个不同的源文件都可以正常编译,但会出现链接错误,原因是有两个地方存在相同的变量,导致编译器无法识别应该使用哪一个。
关于全局变量的几点说明:
①默认情况下,C语言中的全局变量和函数的作用域仅限于定义和声明这个函数或变量的内部,如果需要从这个C文件之外访问这些函数或者全局变量就需要使用 extern关键字进行声明,这是因为C编译器是以C文件为单位进行编译的,如果这个C文件中引用了其他文件中定义的函数或者变量,编译器将无法找到这个函数或者变量的定义,从而给出该函数或者变量未定义的错误信息。
②static关键字用于全局变量的声明时,作用类似于函数的情况,这个全局变量的作用域将局限在声明该变量的c文件内部,这个c文件之外的代码将无法访问这个变量。编译的时候将会出现类似undeference to "xxx"的报错,它是找不到xxx的,因为使用static相当于进行了文件隔离。
3、那么再引申另一个问题,能不能在头文件中定义全局变量?
因为变量只能被定义一次,包含了头文件的源文件,都将会定义同样的全局变量,造成冲突,所以,头文件中不能定义全局变量。还有网友从节省内存的角度来分析,还得到了很多赞,我觉得解释的不对啊!详见c语言 中 为什么不将全局变量的定义放在头文件中
4、本博客的导火索,
就是因为在一个大的工程中,需要增加一个全局变量,一开始我是加在了某一个头文件中,然后报重复定义的错误,很显然,就是因为第2点中说的,由于这个头文件被多个源文件include,虽然在编译阶段可能能通过,但是在链接的时候就会出现重复定义的错误。
解决办法:
①处于尽可能的改动较少的文件的文件的原则,自己写一个头问价,文件内容就一条:全局变量的定义。这样的话,在需要使用的位置通过include这个头文件就可以了。但是,如果有多个源文件需要使用使用这个变量的话,这种情况也会发生重复定义的错误,因为include的过程就是复制的过程,那么很显然了,这个头文件被拷贝到了多个源文件中,链接时肯定会出现重复定义的错误啊。
而且,假设只有一个源文件需要这个全局变量,那么直接在这个源文件中定义全局变量就好了啊!还定义什么鬼头文件哦!
②假设工程中的多个源文件需要这个全局变量,那么你就任找一个源文件,把这个全局变量定义到这个源文件中,然后新建一个头文件,在里面进行extern 这个变量的声明,最后在需要使用这个全局变量的源文件中include你新建的头文件就OK了。
参考:
[1] 嵌入式系统高级C语言编程,凌明编著,第一章概述
[2] C语言可以在不同的源文件中定义相同名字的全局变量吗
能不能在头文件中定义全局变量?相关推荐
- c语言头文件可以定义全局变量,C语言在头文件中定义全局变量
C语言在头文件中定义全局变量 头文件定义全局变量等问题 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 可以,在不同的C文件中以static形式来声明同名全局变量.头文件中不可以直接定 ...
- 头文件中定义全局变量
引言 这些天写的程序中用到了全局变量,一开始是在一个文件下做测试后来把文件按逻辑拆分了一下,不同的代码被放在了几个文件中,最后用Makefile来编译就遇到了今天的话题,怎么在头文件中定义全局变量呢? ...
- C++头文件中定义全局变量在多次引用时出现变量多次定义符号冲突的解决办法...
如果头文件多次被include 则全局变量的定义不能写在这个头文件中 建议写在一个Cpp文件中, 然后要用时, 加 extern 头, 再声明一下下就可以用了 如 在.Cpp中 int ...
- 能否用痰盂盛饭——谈谈在头文件中定义外部变量
能否用痰盂盛饭--谈谈在头文件中定义外部变量 - garbageMan - 博客园 能否用痰盂盛饭--谈谈在头文件中定义外部变量 "能否用痰盂盛饭"并非是一个技术问题,而是一个哲学 ...
- c语言头文件中定义inline static相关函数的优劣
头文件中常见static inline函数,于是思考有可能遇到的问题,如头文件经常会被包含会不会产生很多副本?网上说法不一.于是自己验证.经过arm-none-eabi-gcc下测试后得出结论. in ...
- 编写一个头文件,头文件中定义一个宏cube(x)用于求一个数的平方
<程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p145 7.1.2 上级实训内容 [实现内容17]编写一个头文件,头文件中定义一个宏cube(x)用于 ...
- 【自我修养】不要嘻嘻哈哈的在头文件中定义变量
在头文件中直接定义变量甚至定义加上赋值,是非常没有修养的行为,新手是经常这样干,有的老手也不注意,这是不应该的. 在头文件中定义变量会出现这些问题: 1,出现变量重复定义的错误.如果你在头文件中定义了 ...
- C++中头文件中定义的变量
1.在头文件.h中定义static变量,如: static int x;其实就等效于每个引用该头文件的源文件中,定义一个变量名为x的整型静态全局变量,每个文件中的x变量均属于本源文件,各文件中的互不相 ...
- C语言如何使用其他文件定义的结构体?(C++报错:无法转换到不完整的类【需在头文件中定义结构体??】)
文章目录 20210725 但是,我在使用的时候报错提示:无法转换到不完整的类?? 20210726 这样? 调用时直接加个extern就好,头文件管都不用管? 20210725 但是,我在使用的时候 ...
最新文章
- MYSQL 双主搭建
- 2018.11.06-知识回顾
- 如何给Pycharm加上头行 # *_*coding:utf-8 *_*?
- socket和IOCTL结合实现网络采集
- [Erlang 0097] TCP半开的几个小测试
- JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。...
- java怎么输出点,Java实现控制台输出两点间距离
- ejb3persistence.jar javax.persistence的注解配置
- android map 底层实现原理,LinkedHashMap底层实现和原理(源码解析)
- 三菱PLC开发环境搭建笔记
- Ubuntu下Git安装图形化代码合并工具kdiff3
- linux pulseaudio卸载,解决Ubuntu 9.04 下 PulseAudio声音故障
- 360的困兽之斗——探讨奇虎Tecent商业模式
- 史上好电影集合--百度云
- TVP5147调试经验
- bootstrapTable 数据格式
- 了解ESP32睡眠模式及其功耗
- centos 7, 8 的区别
- UDS之浅谈11服务
- Limitless牵手VR社交平台High Fidelity,提供交互角色创建技术
热门文章
- 网页中嵌入视频播放器代码
- 搜狗泛站群原理-搜狗泛收录实现
- P1941 飞扬小鸟题解
- ZSTU 4514: yesky wine锦鲤卡 (线性dp)
- 盘点阿里云服务器活动【最新活动】2核4G 1M带宽 40G高效云盘 云服务器【19/月,269/年,699/3年】
- 开发者论坛一周精粹(第七十一期) 国外企业备案解答 邮箱只能发不能收...
- java计算机毕业设计汽车维修服务系统源代码+数据库+系统+lw文档
- Linux根目录”/“下各个系统文件夹的含义和用途
- 错过的二十年后:香港的科技败局和AI未来
- Game boy模拟器(5):集成