全局变量在头文件中只是一个声明,所以不能赋初值,只有真正定义的时候,才可以赋值,所以一般头文件是extern int g; 这种写法的
C语言在头文件中包含全局变量有三种形式:
1 在头文件中声明一个全局变量,在一个C文件中定义全局变量,然后在所有的引用了这个头文件的C文件里都可以使用该全局变量值。
如在main.c定义
int a = 3;
然后定义一个main.h,那么所有引用main.h的c文件中,均可以访问a并更改其值。
2 在头文件中定义一个静态全局变量。那么所有引用该头文件的C文件,均拥有一个作用域在本文件范围内的同名静态全局变量。不同文件中的该变量虽然同名,但却是不同的变量。
比如在a.h中定义
static int a = 3;
那么在a.c中引用a.h,并将a值修改为4。
在b.c中也引用a.h,不对a值做修改,打印a值,仍为3, 不会因为a.c中的修改而改变值。
3 在头文件中定义全局变量。该头文件仅可以被一个C文件引用一次。
比如a.h中定义
int a = 3;
在a.c中可以引用a.h,并对a进行访问和修改。
如果在同项目下有b.c引用了a.h,编译器在链接时会报同名全局变量的错误,导致编译失败。
int g=3为显示的赋值,很多编译器容易出错,应该先声明 在赋值,int g;g=3;
A.h:
int g;
A.c:int g=3;两次声明,不能多次声明统一变量,应该
A.h:
int g;
A.c: g=3;
.h头文件中一般只做变量或者函数的声明,而赋值一般放到.c文件中,这样就不会出错了
A.h:
int g=3;
B.c: #include"A.h"
#include
int main()
{
int g=2; //这里会出现错误
printf("%d\n",g);
return 0;
}
因为B.c中的
#include"a.h"相当于把a.h中的内容拷贝过来
相当于b,c的内容是
int g=3;
#include
int main()
{
int g=2; //如果这样写当然就会出现错误了
printf("%d\n",g);
return 0;
}