c语言 中 为什么不将全局变量的定义放在头文件中

 我来答
三落H
2020-09-21
知道答主
回答量:22
采纳率:0%
帮助的人:16.3万
展开全部

首先要说明什么是全局变量,c语言中全局变量一般是指定义在函数体外的变量。全局变量按可访问性可分为外部变量内部变量

内部变量是指使用了static关键字修饰的全局变量,它的可访问范围(作用域)被限定在本源文件所在的链接文件模块中,不能被其它文件模块引用。反之没有被static关键字修饰的全局变量则是外部变量,其它文件模块可以通过extern关键字引用该全局变量并访问。

要说明的是全局变量无论是内部变量还是外部变量,的存储类别都是静态的,也就是放到静态内存区域中,它编译链接阶段就已经分配好了固定的内存。

搞清楚上面的内容,就很容易得出若把全局变量放在头文件会有哪些问题;

一 对内部变量来说,每个include该头文件的文件模块中都会单独为这个内部变量分配静态内存空间,这个空间是相对独立的,是一种空间浪费,同时还失去了全局变量访问一致性的特点,实在没有什么意义。如果这个头文件只被一个模块使用,对于这个文件模块来说应该没啥问题。

二 对外部变量来讲,这个头文件被多个文件模块include的情况下,链接过程会报错,因为符号冲突,所有include这个头文件的模块都会有这个全局符号。在这个头文件仅仅只被一个模块include的时候可以正常使用。

经上分析得出要避免全局变量定义在头文件中,因为当这个头文件被多方include的时候会产生一些不必要的麻烦,就这么多。

全局变量作用域范围较广,被错误修改后排查定位问题比较困难,若非必带仔腔要尽少使用。

下面说一下比较好的戚磨方式就是全局变量只定义在实现文件(.c,.m)中,对内部变量没啥说的它只在文件模块内部使用,对外部变量可以在该模块头文件中使用extern关键字修饰一下,这样其它文件模块蠢衫只要直接include该头文件就可以使用模块中的外部变量了。

百度网友c640263
推荐于2018-03-20
知道答主
回答量:7
采纳率:0%
帮助的人:9万
展开全部
原因有二:
一、跟行亮踪难度大。如果工程小,跟踪其变化没有什嫌空么难度,如果工程很大,包含这个头文件的文件都有可能修改其值,出了问题不好排查。
二、c主要还是用于嵌入式,与硬件有关。许多嵌入式系统的内存不想电脑那么大,如果在头文件中声明全局变量,那么所有引用该头芹带瞎文件的文件都将为此变量非配内存,这样降低了内存的利用率,有时几K就是致命的。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
首都有钱小少爷
2019-09-29 · 超过24用户采纳过TA的回答
知道答主
回答量:83
采纳率:0%
帮助的人:39万
展开全部
因为你的头文件可能会被多洞锋个c文件包含,这样一来多个c文件中就会有同一个全局变量的定义(强符号),纳者晌链接器就会不知道该使用哪个符号来链接从而出错嫌首(重定义)。声明会被认为是弱符号所以头文件中一般只写声明。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tidecao2006
2011-10-31 · TA获得超过1228个赞
知道小有建树答主
回答量:842
采纳率:0%
帮助的人:780万
展开全部
如果全局变量兆核放在头文件里面告猜睁,那袜岁么意味着它将不能初始化,否则多个编译单元包含头文件的时候将会出错。不能初始化的话,多个编译单元都能对其进行修改,这使程序可维护性变差。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
王博好帅
2011-10-31 · TA获得超过293个赞
知道答主
回答量:25
采纳率:0%
帮助的人:14.1万
展开全部
一般情况下变量都不放在没手头文件中,这样做一是因为规定,二是因为:变量一般情况下都是再你编的程序大察散滚氏中重新定义,也就是用到什么定义什么,用多少定义多少。希望对你有帮助。我的Q号是619100612.希望能帮到你。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式