在头文件中中定义全局变量的有关问题
在头文件中中定义全局变量的问题
使用#ifndef在头文件中定义全局变量,然后两个.c文件分别访问,编译时就会出现multiple definition的提示,但是已经使用了条件编译,理论上第二次应该跳过定义过程,这是为什么呢?
------解决方案--------------------
文件A 包含文件B 同时有自己特有的内容
文件C同时 包含文件A 和 文件B
如果不做条件编译 在文件C 文件B会被包含2次
当然你也可以说 文件C只包含文件A 就能有同样的效果啊
我会告诉你 的确是那样
然后对于一个几百个头文件的小项目 你这么干试试
------解决方案--------------------
那是因为你在.h 文件中,也加入了extern xxx ,只在.C 文件中加入extern xxx 即可。
------解决方案--------------------
像
这类条件编译是为了防止同一个.c文件包含同一个头文件多次。
楼主要明白:每一个.c文件最后都会编译生成对应的.obj文件的。所以你的两个.c文件对应的两个.obj文件都会有你说的那个全局变量的,链接的时候,链接器就会发现有定义了两个同名变量,于是就报multiple definition错误。
正确的做法是:是其中一个.c文件定义这个变量,在另外一个.c文件用
声明,这就可以在两个.c都使用这个变量了。
------解决方案--------------------
不是一个.c文件包含另外一个.c文件。没有人会这样组织代码的。
条件编译为了防止一个.c文件多次包含一个.h文件。
比如有a.h, b.h,main.c三个文件,b.h文件include了a.h文件。而在main.c文件中首先include了a.h,然后再include了b.h文件。这样就会出现包含一个头文件多次的情况。这时条件编译就能派上用场了。
使用#ifndef在头文件中定义全局变量,然后两个.c文件分别访问,编译时就会出现multiple definition的提示,但是已经使用了条件编译,理论上第二次应该跳过定义过程,这是为什么呢?
------解决方案--------------------
文件A 包含文件B 同时有自己特有的内容
文件C同时 包含文件A 和 文件B
如果不做条件编译 在文件C 文件B会被包含2次
当然你也可以说 文件C只包含文件A 就能有同样的效果啊
我会告诉你 的确是那样
然后对于一个几百个头文件的小项目 你这么干试试
------解决方案--------------------
那是因为你在.h 文件中,也加入了extern xxx ,只在.C 文件中加入extern xxx 即可。
------解决方案--------------------
像
#ifndefine
#define
#endif
这类条件编译是为了防止同一个.c文件包含同一个头文件多次。
楼主要明白:每一个.c文件最后都会编译生成对应的.obj文件的。所以你的两个.c文件对应的两个.obj文件都会有你说的那个全局变量的,链接的时候,链接器就会发现有定义了两个同名变量,于是就报multiple definition错误。
正确的做法是:是其中一个.c文件定义这个变量,在另外一个.c文件用
extern int g_a;
声明,这就可以在两个.c都使用这个变量了。
------解决方案--------------------
不是一个.c文件包含另外一个.c文件。没有人会这样组织代码的。
条件编译为了防止一个.c文件多次包含一个.h文件。
比如有a.h, b.h,main.c三个文件,b.h文件include了a.h文件。而在main.c文件中首先include了a.h,然后再include了b.h文件。这样就会出现包含一个头文件多次的情况。这时条件编译就能派上用场了。