下边是网上的一段话:
最好不要傻嘻嘻的在头文件里定义什么东西。比如全局变量:
/*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、我们也可以为变量加上修饰符。
一般来说,不会将全局变量的定义写在头文件中,因为如果多个c源文件都添加了头文件,那很容易引起重定义的问题,这时候一般编译器都会提示。
正确的作法是在c源文件中定义一个全局变量。在头文件中加入全局变量的声明。比如
//var.c 一个主要用于定义全局变量的c源文件你得理解:
我们把.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?