![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
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 展开
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文件定义,也就是赋值,所以你第二种可以编译通过,第一种直接在头文件定义就会出错
展开全部
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,编译器在链接时会报同名全局变量的错误,导致编译失败。
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;
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<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;
}
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询