C语言头文件定义全局变量问题

下边是网上的一段话:最好不要傻嘻嘻的在头文件里定义什么东西。比如全局变量:/*xx头文件*/#ifndef_XX_头文件.H#define_XX_头文件.HintA;#e... 下边是网上的一段话:
最好不要傻嘻嘻的在头文件里定义什么东西。比如全局变量:
/*xx头文件*/
#ifndef
_XX_头文件.H
#define
_XX_头文件.H
int A;
#endif

那么,很糟糕的是,这里的int
A是个全局变量的定义,所以如果这个头文件被多次引用的话,你的A会被重复定义,显然语法上错了。只不过有了这个#ifndef的条件编译,所以能保证你的头文件只被引用一次,不过也许还是不会出岔子,但若多个c文件包含这个头文件时还是会出错的,因为宏名有效范围仅限于本c源文件,所以在这多个c文件编译时是不会出错的,但在链接时就会报错,说你多处定义了同一个变量,
Linking...
incl2.obj : error LNK2005: "int glb" (?glb@@3HA)
already defined in incl1.obj
Debug/incl.exe : fatal error LNK1169: one
or more multiply defined symbols found

注意!!!

我不是很理解,因为试验(所有.h文件都使用了条件编译指令,防止多次展开)。
A.h int a;
B.h include了A.h
C.h include了B.h。
gcc B.c C.c A.c是编译通过的。这是什么问题?上边这段话,我该怎么理解,有人能帮忙给我举例并测试解释一下吗?
请各位大侠,不要说什么建议,不要说什么想这个没有意义。现在我就想知道答案。
不能跟我解释的,就算了。
展开
 我来答
滟丽00
高粉答主

2019-05-07 · 繁杂信息太多,你要学会辨别
知道答主
回答量:1487
采纳率:0%
帮助的人:22.2万
展开全部

1、首先,我们可以在函数外面定义变量,就是全局变量。

2、局部变量可以与全局变量同样命名。

3、但是优先级是局部变量优先。

4、但是局部变量的生命周期是整个结构内。

5、全局变量是整个程序结束,才释放。

6、我们也可以为变量加上修饰符。

吉祥二进制
高粉答主

推荐于2017-09-23 · 科技改变生活,生活改变科技。
吉祥二进制
采纳数:33926 获赞数:84564

向TA提问 私信TA
展开全部

一般来说,不会将全局变量的定义写在头文件中,因为如果多个c源文件都添加了头文件,那很容易引起重定义的问题,这时候一般编译器都会提示。


正确的作法是在c源文件中定义一个全局变量。在头文件中加入全局变量的声明。比如

//var.c 一个主要用于定义全局变量的c源文件
int g_a;
char g_x;


//var.h 用于声明定义的全局变量
extern int  g_a;
extern char g_x; 


//test.c 一个用于测试的头文件
#include <var.h>
void f(){
    g_a = 1;
    g_x = 'x';
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
52927588
推荐于2017-10-10 · 超过14用户采纳过TA的回答
知道答主
回答量:31
采纳率:0%
帮助的人:19.3万
展开全部

你得理解:

  1. 我们把.c和.h分开是为什么

  2. 连接做的事情就是把.c和.h又合在一起,不仅如此,还把ABC都合在一起(而你的条件编译指令仅限于第一个阶段起作用!);于是包含了int a声明的a.o、b.o和c.o在合成xx.out的时候,就有3次int a声明;

  3. 通常正确的做法是:把”变量/函数声明“放在.h,而把”变量/函数定义“放在.c;那么你的这句int a是声明还是定义?从错误提示“。。。already defined。。。”可以看出链接工具把它识别为“定义”而不是“声明”。函数声明不会有这种问题,而变量的声明和定义(尤其在不带初始化的情况下)就长的一模一样。所以我的建议是,你不要纠结这个问题了,把这句int a放在A.c里面,然后去B.h和C.h里面声明extern int a(还要啰嗦一句,变量不要用一个字母a就概括了);

希望对你有帮助

追问
我们研讨会,就是要要知道这个问题。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2014-06-14 · TA获得超过718个赞
知道小有建树答主
回答量:1179
采纳率:0%
帮助的人:608万
展开全部
其实没必要纠结~~你只要注意头文件~~的定义~~然后在引用的时候注意引用了哪个就好了~~这语句有点乱~~你自己规范点就好了~~想那么多没用的东西干嘛~~哪一个正常点的项目看看代码
追问
我想知道答案。so?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式