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

问题一:A.h:intg=3;A.c:无B.h:无B.c:#include"A.h"结果是B.c中使用g,gcc编译说多次定义g错误!为什么?问题二:而A.h:intg;... 问题一:
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
展开
 我来答
哈妮宝贝0602
2013-08-28
知道答主
回答量:28
采纳率:0%
帮助的人:13.2万
展开全部
全局变量在头文件中只是一个声明,所以不能赋初值,只有真正定义的时候,才可以赋值,所以一般头文件是extern int g; 这种写法的
追问
这种写法错误在哪呢?
追答
错误就是,你只能在头文件做声明,然后在C文件定义,也就是赋值,所以你第二种可以编译通过,第一种直接在头文件定义就会出错
_叶子妞妞_
推荐于2017-09-03 · TA获得超过3672个赞
知道小有建树答主
回答量:327
采纳率:83%
帮助的人:88万
展开全部
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,编译器在链接时会报同名全局变量的错误,导致编译失败。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
孟戈大师
2013-08-28 · 超过53用户采纳过TA的回答
知道小有建树答主
回答量:173
采纳率:100%
帮助的人:87.6万
展开全部
int g=3为显示的赋值,很多编译器容易出错,应该先声明 在赋值,int g;g=3;
A.h:
int g;
A.c:int g=3;两次声明,不能多次声明统一变量,应该
A.h:
int g;
A.c: g=3;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友cc21aee
2013-08-28 · TA获得超过2044个赞
知道小有建树答主
回答量:1273
采纳率:100%
帮助的人:1216万
展开全部
.h头文件中一般只做变量或者函数的声明,而赋值一般放到.c文件中,这样就不会出错了
追问
这种写法错误在哪呢?
追答
会出现重复定义
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
inu1255
2013-08-28 · TA获得超过105个赞
知道小有建树答主
回答量:100
采纳率:0%
帮助的人:118万
展开全部
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;

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式