但是有的时候我们写程序比较大的时候头文件很多,我们就需要不断的对同一全局档键变量重复声明,这样很行指巧繁琐而且低效。所以我们需要一种只需要在一种定义一次其它文件就不需要写声明的方法。在看到uC/Os 实时 *** 作系统源码的时候我发现了这种方法。
比如我把全局变量定义在a.h文件里面。如下
#ifdef QUANJU
#define EXTN //定义EXTN为空
#eles
#define EXTN extern
#endif
EXTN char g_test1;
然后在b.c:
#define QUANJU
#include "a.h"//在该文件中a.h定义了一次g_test1
在d.c:
#include "a.h"//在该文件中a.h声明g_test1
上面三个文件中a.h文件逗尺里面的功能是:假如定义了QUANJU则EXTN 为空, 就把“EXTN char g_test1;”当成全局变量g_test1的定义(即 char g_test1)。假如没有定义QUANJU则EXTN 为extern,就把“EXTN char g_test1;”当成声明(即“extern char g_test1”)
然后无论什么文件使用全局变量g_test1,只要调用a.h,就不用再声明了。因为只要调用a.h由于没有宏定义QUANJU所以就等于在a.h声明了g_test1。只有b.c文件里面宏定义了QUANJU所以b.c里面调用的a.h就是定义g_test1。
1、全局变量也梁咐称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。
只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。
但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。外部变量是在函数外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的
结尾。在此作用域内,全局变量可为各个函数所引用。编译时将外部变量分配在静态存储区。
有时需要在其他文件中使用extern来声明外部变量,以扩展外部变量的作用域。
也可用static声明外部变量,使该变量不能被其他文件引用。有时候他们是一样的,只有稍微一点的区别而已,不用太过于区分的。
2、定义及引用方法:银渣亏
#ifdef xxx_GLOBALS
#define xxx_EXT#else#define xxx_EXT extern
#endif 上面位于.H 文件中,每个全局变量都加上了xxx_EXT的前缀,xxx代表模块的名字。该模块的.C文件中有以下定义:#define xxx_GLOBALS
当编译器处理.C文件时,它强制xxx_EXT(在相应.H文件中可以找到)为空,(因为xxx_GLOBALS已经定义)。所以编译器给每个全局变量分配内存空间,而当编译器处理其他.C文件时,xxx_GLOBAL没有定义,xxx_EXT被定义为extern,这样用户就可以调用外部全局变量。进阶:在abc.H:#ifdef abc_GLOBALS
#define abc_EXT#else
#define abc_EXT extern#endif
abc_EXT unsigned int Ctr
同时,abc.H有中以下定义:#define abc_GLOBALS
当编译器处理abc.C时,它使得头文件变成如下所示,因为abc_EXT被设置为空。unsigned int Ctr
这样编译器锋神就会将这些全局变量分配在内存中。当编译器处理其他.C文件时,头文件变成了如下的样子,因为abc_GLOBAL没有定义,所以abc_EXT被定义为extern。extern unsigned int Ctr
在这种情况下,不产生内存分配,而任何 .C文件都可以使用这些变量。这样的就只需在 .H 文件中定义一次就可以了。
在C语言中,全局变量和函数声明及定义并列,也就是说,声明在最外层作用域的变量卖梁即为全局变量如在如下程序中
int i
int main()
{
int i_copy = i
i = 9
return 0
}
int
i就是一个全局变量,故在main函数中可以调用或修改i的值
所以,定义数组也和普通全局变量的方法相同,如
char str[10]
int main()
{
str[0] = 'a'
str[1] = '\0'
return 0
}
但是有几点需要注意:
C中自上向下语法分析和编译语法树,如果要让所有函数都能调用该全局变量,橡镇就要把其放在所有函数定义之前,确保声明的作用域覆盖整个程序;
在全局变量声明时,其初梁配粗始值必须为编译时常量,不能为变量;
若要使用程序外的全局变量,需要在修饰符中加入extern关键字,并不要忘了和原本定义处链接
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)