#ifndef怎么用呢?

[复制链接]
 楼主| areshan 发表于 2011-6-13 09:07 | 显示全部楼层 |阅读模式
大家好,为什么在头文件的开头一般都有这样的宏定义呢?
#ifndef   ******
#define  ******



#endif
说是为了定义唯一的宏,但是不怎么能理解!怎么个唯一呢?这个唯一和头文件有什么关系呢?头文件的#include"*****"不就是一个复制包含吗?
 楼主| areshan 发表于 2011-6-13 10:16 | 显示全部楼层
懂了,我以前看到保证是唯一的宏定义,始终没有能理解。其实它就是防止该头文件被多次包含。举个例子,某个文件要用到2个头文件:#include "project.h"和#include"io.h",这两个头文件都是自己定义的,但是每个头文件都包含了#include<reg51.h>的话,是可以的,不会提示重定义,其中就是靠上面的#ifndef #define
#endif完成的!如果你要是把上面的那些去掉的话,就会重定义了,编译就会有警告!
谢谢ayb_ice,和原野之狼的帮助!
lxyppc 发表于 2011-6-13 17:29 | 显示全部楼层
呵呵,#ifndef某种程度上是可以防止变量重复定义的,在某些‘大作’中,经常见到。
#ifndef  xxx
#define xxx
unsinged char k1;
#endif
俺也一直弄不明白,为什么有人这些写,这么写到底是为了什么!?
--------- ...
yewuyi 发表于 2011-6-13 17:08

这种非主流用法不在讨论之列
我举个例子
有两个模块
叫做A和B,都有各自的头文件a.h,b.h,都有各自的实现文件a.c,b.c
他们都用到了一个头文件,叫做type.h
在type.h中定义了一些uint32_t,uint16_t,uint8_t之类的类型声明
在a.h中有#include "type.h"
在b.h中有#include "type.h"
现在有一个产品,要求同时使用a,b这两个模块,并且需要交互

如果不用#ifndef 防重复技术
那么#include "type.h"不能出现头文件中
而在使用a和b模块的文件中,只能这样写
#include "type.h"
#include "a.h"
#include "b.h"
也就是说,在使用a,b模块的时候,你必须要知道他们使用了哪些公用的头文件,然后按顺序进行include

如果使用了#ifndef 防重复技术,你不用考虑这些

如果一个系统有a,b,c,d,e,f这几个模块
a,c,d会引用公共的头文件,x.h
b,c,d,e,f会引用公共的头文件,y.h
c,d又会依赖a和f
好了,这下你要同时用这几个模块那就乱套了。

评分

参与人数 1威望 +2 收起 理由
原野之狼 + 2 我很赞同

查看全部评分

ayb_ice 发表于 2011-6-13 09:23 | 显示全部楼层
防止重复包含同一个文件
原野之狼 发表于 2011-6-13 09:24 | 显示全部楼层
那是为了防止对头文件的重复包含。
你说的定义唯一的宏,不知道从哪里看见的资料。
xwj 发表于 2011-6-13 10:55 | 显示全部楼层
呵呵,理解了就好,建议斑竹给LS加裤子
原野之狼 发表于 2011-6-13 11:29 | 显示全部楼层
呵呵,理解了就好,建议斑竹给LS加裤子
xwj 发表于 2011-6-13 10:55

LZ不但提出了问题 而且还把解决问题的方式做了详细的正确的阐述 所以赠内裤一条:lol
xwj 发表于 2011-6-13 11:32 | 显示全部楼层
哈哈,布置LS的斑竹是男是女,LZ又是男是女?

要是一个男人收到男人的内裤....
xwj 发表于 2011-6-13 11:48 | 显示全部楼层
哈哈,不知6楼的斑竹是男是女,LZ又是男是女?

要是一个男人收到男人的内裤....
yewuyi 发表于 2011-6-13 11:56 | 显示全部楼层
俺一直认为,其实这个包含问题这么处理并不好,重复包含本来就不对,这么做其实是掩盖了问题
xwj 发表于 2011-6-13 12:40 | 显示全部楼层
不赞成LS,个人觉得这个是对的,属于条件编译的最典型应用,而不是“掩盖了问题”
mohanwei 发表于 2011-6-13 12:48 | 显示全部楼层
用C编过规模大点、文件和模块较多的程序,就会发现这是最好的解决方案,没有“之一”……
鸟鸟 发表于 2011-6-13 12:56 | 显示全部楼层
pentral0311 发表于 2011-6-13 12:57 | 显示全部楼层
LS的说的很对,特别是多人多任务交叉编写一个软件工程的时候
ayb_ice 发表于 2011-6-13 13:23 | 显示全部楼层
俺一直认为,其实这个包含问题这么处理并不好,重复包含本来就不对,这么做其实是掩盖了问题
yewuyi 发表于 2011-6-13 11:56

我也有这种感觉
sysdriver 发表于 2011-6-13 13:31 | 显示全部楼层
以前我挺在意头文件的,但是现在我认为可以不需要头文件.呵呵,有点叛逆啊.

比如结构,ICC.h和ICC.c   ; 按照模块分层,隐藏,封装的理念,ICC.h起到的作用仅仅是外部声明而已,ICC的应用函数估计不是很多,为什么不直接把声明放到ICC.c里面呢?

当然有特殊情况了,比如系统配置需要的常量太多,配置太多,需要config.h是可以理解的.所以我认为,头文件要看情况决定用不用.
原野之狼 发表于 2011-6-13 13:32 | 显示全部楼层
关于这个问题我倒是不同意老叶和ayb_ice两人的看法
有的时候 这个重复包含是不可避免的
yewuyi 发表于 2011-6-13 13:40 | 显示全部楼层
关于这个问题我倒是不同意老叶和ayb_ice两人的看法
有的时候 这个重复包含是不可避免的
原野之狼 发表于 2011-6-13 13:32


宏定义重复包含出现是可能的,此时用#indef或#ifndef也正常,但整个文件通过这种方式来避免重复包含,俺个人认为:不好。

俺自己反正是不喜欢用,当然别的同事用,俺也不反对,只是感觉不必要。
ayb_ice 发表于 2011-6-13 13:48 | 显示全部楼层
我的意思是最好程序员自己显示确保不重复包含同一个文件,至少在MCU项目中是很好保证这个条件的,在大型,大型多人合作项目中这个还是很有用的
yewuyi 发表于 2011-6-13 14:25 | 显示全部楼层
呵呵,估计现在做应用程序的,用C写大型软件的很少很少了吧。

评分

参与人数 1威望 +1 收起 理由
nfgkjk + 1

查看全部评分

xwj 发表于 2011-6-13 14:26 | 显示全部楼层
那用什么写?
用D写?
用E写?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

728

帖子

0

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

127

主题

728

帖子

0

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