请问个头文件包含的问题,谢谢

[复制链接]
2840|7
 楼主| 新手额 发表于 2009-1-6 16:41 | 显示全部楼层 |阅读模式
sys.c:<br />#define&nbsp;SYS_GLOBAL<br />#include&nbsp;&quot;sys.h&quot;<br /><br />sys.h:<br />#ifndef&nbsp;_SYS_H<br />#define&nbsp;_SYS_H<br /><br />ifdef&nbsp;SYS_GLOBAL<br />u8&nbsp;BitF8[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};<br />#endif<br /><br />#endif<br /><br />test.c:<br />调用BitF8[]提示&nbsp;未定义变量<br /><br />但是如果把sys.h里的ifdef&nbsp;SYS_GLOBAL去掉,又提示BITF8重复定义<br /><br />请问怎么会重复定义,不是有#ifndef&nbsp;_SYS_H&nbsp;#define&nbsp;_SYS_H这个头文件包含了么?<br /><br />请问要在test.c里调用BITF8怎么办?谢谢<br />
清风一士 发表于 2009-1-6 16:57 | 显示全部楼层

切!楼主有问题

切!楼主有问题<br />这样的语句编译器会没反应?<br />ifdef&nbsp;SYS_GLOBAL
twicave 发表于 2009-1-6 17:19 | 显示全部楼层

reply

1。<br />sys.c:<br />#define&nbsp;SYS_GLOBAL&nbsp;&nbsp;//这里定义了SYS_GLOBAL使得在sys.c中BitF8是可见的。<br />#include&nbsp;&quot;sys.h&quot;<br /><br />2。<br />test.c:<br />调用BitF8[]提示&nbsp;未定义变量<br />//你肯定没有在test.c包含sys.h前定义SYS_GLOBAL变量吧<br /><br /><br />3。<br />但是如果把sys.h里的ifdef&nbsp;SYS_GLOBAL去掉,又提示BITF8重复定义<br />请问怎么会重复定义,不是有#ifndef&nbsp;_SYS_H&nbsp;#define&nbsp;_SYS_H这个头文件包含了么?<br />//编译的过程是针对各个.c或者.cpp文件的。如果去掉了防护措施,每个文件里都会有一个BitF8数组,编译没问题,链接时就会报这个错误。<br /><br />4。<br />请问要在test.c里调用BITF8怎么办?谢谢<br />//一个基本的原则,不要在头文件中定义变量;而只能声明。标准的共享变量的定义是这样进行的:<br /><br />***.h<br />extern&nbsp;int&nbsp;gA;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在头文件中声明,而不是定义变量<br /><br />***.c<br />#include&nbsp;&quot;***.h&quot;<br />int&nbsp;gA;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在对应的.c文件进行实体定义<br /><br />******.c<br />#include&nbsp;&quot;***.h&quot;&nbsp;&nbsp;&nbsp;&nbsp;//在其他文件中包含声明头文件。<br />...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br />推荐楼主看一下C编码规范之类的书,会有很多收获的。
斜阳下的背 发表于 2009-1-6 17:36 | 显示全部楼层

replay

LS说的很详细,呵呵,我就把问题简单化。<br />.C是先将.H包含进来的,这时,你并没定义SYS_GLOBAL,所以就出现最后的BitF8[]未定义报错
 楼主| 新手额 发表于 2009-1-6 19:23 | 显示全部楼层

请推荐一本编码规范书籍

谢谢你的解答~&nbsp;能否再推荐一本较好的编码规范书籍<br />电子版/纸板都可以<br /><br />谢谢
twicave 发表于 2009-1-7 08:51 | 显示全部楼层

about book

我主要是做桌面应用的,手头有一本&ltC++编码规范&gt陈世忠,人邮.<br />C的编码规范一定会有,你可以在书店扫扫.豆瓣上也可以先搜索一下.<br />good&nbsp;luck.
daFish 发表于 2009-1-13 17:18 | 显示全部楼层

唉,头文件不要放定义,只放声明。

遵循良好的代码编写习惯可让你少吃不少的苦头~~~
JUROON 发表于 2009-1-21 13:38 | 显示全部楼层

可能是这样的

我猜测你在定义宏SYS_GLOBAL之前包含了其他的头文件,而那些头文件又引入了“sys.h”。也就是“sys.h”在你实际想引入的地方之前已经被插入。此后,在你显式的#include&nbsp;sys.h时,因为_SYS_H已经定义了相当于引入了一个空文件。这导致你的第一个问题:BitF8没有定义。<br /><br />你的sys.h可能被多个c文件包含,那么BitF8自然会多次定义。<br /><br />解决的方法:<br />1&nbsp;在一个合适的C中定义BitF8,并在sys.h中声明;<br />2&nbsp;考虑一个方案,别再用BitF8这个变量了,它增加你程序的耦合。<br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

34

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部