首先要说明什么是全局变量,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中的全局数组了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)