![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
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是编译通过的。这是什么问题?上边这段话,我该怎么理解,有人能帮忙给我举例并测试解释一下吗?
请各位大侠,不要说什么建议,不要说什么想这个没有意义。现在我就想知道答案。
不能跟我解释的,就算了。 展开
最好不要傻嘻嘻的在头文件里定义什么东西。比如全局变量:
/*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是编译通过的。这是什么问题?上边这段话,我该怎么理解,有人能帮忙给我举例并测试解释一下吗?
请各位大侠,不要说什么建议,不要说什么想这个没有意义。现在我就想知道答案。
不能跟我解释的,就算了。 展开
4个回答
展开全部
一般来说,不会将全局变量的定义写在头文件中,因为如果多个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';
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你得理解:
我们把.c和.h分开是为什么
连接做的事情就是把.c和.h又合在一起,不仅如此,还把ABC都合在一起(而你的条件编译指令仅限于第一个阶段起作用!);于是包含了int a声明的a.o、b.o和c.o在合成xx.out的时候,就有3次int a声明;
通常正确的做法是:把”变量/函数声明“放在.h,而把”变量/函数定义“放在.c;那么你的这句int a是声明还是定义?从错误提示“。。。already defined。。。”可以看出链接工具把它识别为“定义”而不是“声明”。函数声明不会有这种问题,而变量的声明和定义(尤其在不带初始化的情况下)就长的一模一样。所以我的建议是,你不要纠结这个问题了,把这句int a放在A.c里面,然后去B.h和C.h里面声明extern int a(还要啰嗦一句,变量不要用一个字母a就概括了);
希望对你有帮助
追问
我们研讨会,就是要要知道这个问题。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实没必要纠结~~你只要注意头文件~~的定义~~然后在引用的时候注意引用了哪个就好了~~这语句有点乱~~你自己规范点就好了~~想那么多没用的东西干嘛~~哪一个正常点的项目看看代码
追问
我想知道答案。so?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询