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

2024-12-20 06:49:24
推荐回答(5个)
回答1:

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

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

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

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

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

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

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

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

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

回答2:

原因有二:
一、跟踪难度大。如果工程小,跟踪其变化没有什么难度,如果工程很大,包含这个头文件的文件都有可能修改其值,出了问题不好排查。
二、c主要还是用于嵌入式,与硬件有关。许多嵌入式系统的内存不想电脑那么大,如果在头文件中声明全局变量,那么所有引用该头文件的文件都将为此变量非配内存,这样降低了内存的利用率,有时几K就是致命的。

回答3:

因为你的头文件可能会被多个c文件包含,这样一来多个c文件中就会有同一个全局变量的定义(强符号),链接器就会不知道该使用哪个符号来链接从而出错(重定义)。声明会被认为是弱符号所以头文件中一般只写声明。

回答4:

如果全局变量放在头文件里面,那么意味着它将不能初始化,否则多个编译单元包含头文件的时候将会出错。不能初始化的话,多个编译单元都能对其进行修改,这使程序可维护性变差。

回答5:

一般情况下变量都不放在头文件中,这样做一是因为规定,二是因为:变量一般情况下都是再你编的程序中重新定义,也就是用到什么定义什么,用多少定义多少。希望对你有帮助。我的Q号是619100612.希望能帮到你。