打印

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

[复制链接]
1974|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
新手额|  楼主 | 2009-1-6 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
sys.c:
#define SYS_GLOBAL
#include "sys.h"

sys.h:
#ifndef _SYS_H
#define _SYS_H

ifdef SYS_GLOBAL
u8 BitF8[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
#endif

#endif

test.c:
调用BitF8[]提示 未定义变量

但是如果把sys.h里的ifdef SYS_GLOBAL去掉,又提示BITF8重复定义

请问怎么会重复定义,不是有#ifndef _SYS_H #define _SYS_H这个头文件包含了么?

请问要在test.c里调用BITF8怎么办?谢谢

相关帖子

沙发
清风一士| | 2009-1-6 16:57 | 只看该作者

切!楼主有问题

切!楼主有问题
这样的语句编译器会没反应?
ifdef SYS_GLOBAL

使用特权

评论回复
板凳
twicave| | 2009-1-6 17:19 | 只看该作者

reply

1。
sys.c:
#define SYS_GLOBAL  //这里定义了SYS_GLOBAL使得在sys.c中BitF8是可见的。
#include "sys.h"

2。
test.c:
调用BitF8[]提示 未定义变量
//你肯定没有在test.c包含sys.h前定义SYS_GLOBAL变量吧


3。
但是如果把sys.h里的ifdef SYS_GLOBAL去掉,又提示BITF8重复定义
请问怎么会重复定义,不是有#ifndef _SYS_H #define _SYS_H这个头文件包含了么?
//编译的过程是针对各个.c或者.cpp文件的。如果去掉了防护措施,每个文件里都会有一个BitF8数组,编译没问题,链接时就会报这个错误。

4。
请问要在test.c里调用BITF8怎么办?谢谢
//一个基本的原则,不要在头文件中定义变量;而只能声明。标准的共享变量的定义是这样进行的:

***.h
extern int gA;      //在头文件中声明,而不是定义变量

***.c
#include "***.h"
int gA;             //在对应的.c文件进行实体定义

******.c
#include "***.h"    //在其他文件中包含声明头文件。
...                 



推荐楼主看一下C编码规范之类的书,会有很多收获的。

使用特权

评论回复
地板
斜阳下的背| | 2009-1-6 17:36 | 只看该作者

replay

LS说的很详细,呵呵,我就把问题简单化。
.C是先将.H包含进来的,这时,你并没定义SYS_GLOBAL,所以就出现最后的BitF8[]未定义报错

使用特权

评论回复
5
新手额|  楼主 | 2009-1-6 19:23 | 只看该作者

请推荐一本编码规范书籍

谢谢你的解答~ 能否再推荐一本较好的编码规范书籍
电子版/纸板都可以

谢谢

使用特权

评论回复
6
twicave| | 2009-1-7 08:51 | 只看该作者

about book

我主要是做桌面应用的,手头有一本<C++编码规范>陈世忠,人邮.
C的编码规范一定会有,你可以在书店扫扫.豆瓣上也可以先搜索一下.
good luck.

使用特权

评论回复
7
daFish| | 2009-1-13 17:18 | 只看该作者

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

遵循良好的代码编写习惯可让你少吃不少的苦头~~~

使用特权

评论回复
8
JUROON| | 2009-1-21 13:38 | 只看该作者

可能是这样的

我猜测你在定义宏SYS_GLOBAL之前包含了其他的头文件,而那些头文件又引入了“sys.h”。也就是“sys.h”在你实际想引入的地方之前已经被插入。此后,在你显式的#include sys.h时,因为_SYS_H已经定义了相当于引入了一个空文件。这导致你的第一个问题:BitF8没有定义。

你的sys.h可能被多个c文件包含,那么BitF8自然会多次定义。

解决的方法:
1 在一个合适的C中定义BitF8,并在sys.h中声明;
2 考虑一个方案,别再用BitF8这个变量了,它增加你程序的耦合。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

34

帖子

0

粉丝