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是编译通过的。这是什么问题?上边这段话,我该怎么理解,有人能帮忙给我举例并测试解释一下吗?
请各位大侠,不要说什么建议,不要说什么想这个没有意义。现在我就想知道答案。
不能跟我解释的,就算了。

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

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

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

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

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

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

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-23

一般来说,不会将全局变量的定义写在头文件中,因为如果多个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';
}

第2个回答  推荐于2017-10-10

你得理解:

    我们把.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就概括了);

希望对你有帮助

追问

我们研讨会,就是要要知道这个问题。

本回答被提问者采纳
第3个回答  2014-06-14
其实没必要纠结~~你只要注意头文件~~的定义~~然后在引用的时候注意引用了哪个就好了~~这语句有点乱~~你自己规范点就好了~~想那么多没用的东西干嘛~~哪一个正常点的项目看看代码追问

我想知道答案。so?

相似回答