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

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

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

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

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

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

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

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

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

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

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

一般来说,不会将全局变量的定义写在头文件中,因为如果多个c源文件都添加了头文件,那很容易引起重定义的问题,这时候一般编译器都会提示。

正确的作法是在c源文件中定义一个全局变量。在头文件中加入全局变量的声明。比如

//var.c 一个主要用于定义全局变量的c源文件

int g_a

char g_x

//var.h 用于声明定义的全局变量

extern int  g_a

extern char g_x 

//test.c 一个用于测试的头文件

#include <var.h>

void f(){

    g_a = 1

    g_x = 'x'

}

C语言可以通过在.c文件中定义,头文件中extern的方式实现一个能够在所有文件中都可以使用的全局数组变量。

具体做法如下:

设有一个多项目文件有 1.c、2.c和3.c三个源程序文件;

如果有一个全局数组需要所有文件使用,那么可以添加一个data.c文件,在其中添加全局数组的定义;

向项目中添加data.h文件,在data.h文件中用 extern声明该数组;

只需要在相应的.c文件中添加#include "data.h",那么久可以使用data.c中的全局数组了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11774965.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存