c语言头文件包含、全局变量使用问题

问题一:
A.h:
int g=3;
A.c:无

B.h:无
B.c: #include"A.h"

结果是B.c中使用g,gcc编译说多次定义g错误!
为什么?

问题二:

A.h:
int g;
A.c:int g=3;

B.h:无
B.c: #include"A.h"

结果是B.c中使用g,gcc编译通过,无问题
为什么?

所有.c文件都包含对应.h文件,所以.h文件都用了ifndefine/define/endif
所有.h文件都用了ifndefine/define/endif

全局变量在头文件中只是一个声明,所以不能赋初值,只有真正定义的时候,才可以赋值,所以一般头文件是extern int g; 这种写法的追问

这种写法错误在哪呢?

追答

错误就是,你只能在头文件做声明,然后在C文件定义,也就是赋值,所以你第二种可以编译通过,第一种直接在头文件定义就会出错

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-03
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,编译器在链接时会报同名全局变量的错误,导致编译失败。
第2个回答  2013-08-28
int g=3为显示的赋值,很多编译器容易出错,应该先声明 在赋值,int g;g=3;
A.h:
int g;
A.c:int g=3;两次声明,不能多次声明统一变量,应该
A.h:
int g;
A.c: g=3;
第3个回答  2013-08-28
.h头文件中一般只做变量或者函数的声明,而赋值一般放到.c文件中,这样就不会出错了追问

这种写法错误在哪呢?

追答

会出现重复定义

第4个回答  2013-08-28
A.h:
int g=3;
B.c: #include"A.h"
#include<stdio.h>

int main()

{
int g=2; //这里会出现错误

printf("%d\n",g);

return 0;

}

因为B.c中的
#include"a.h"相当于把a.h中的内容拷贝过来
相当于b,c的内容是
int g=3;
#include<stdio.h>

int main()

{
int g=2; //如果这样写当然就会出现错误了

printf("%d\n",g);

return 0;

}追问

但是我 所有.h文件都用了ifndefine/define/endif

追答

#ifndefine A_H
#define A_H
int g=3;
#endif

ifndefine/define/endif这些关键字只是用来告诉GCC该怎么编译,它实际上并非C语言代码

#ifndefine A_H //GCC看来这一行就检查是否定义了A_H,
//如果定义了,那么到endif中间的东西编译器就不会编译了,相当于if语句;
//头文件中加这个,只是防止程序中多次#include"a.h"时出错
#define A_H
int g=3;
#endif
#include

int main()

{
//#ifndefine A_H 加上这两句,编译器发现已经定义了A_H 就不会编译下面一行了
int g=2; //如果这样写当然就会出现错误了
//#endif
printf("%d\n",g);

return 0;

}

相似回答