打印

#ifndef怎么用呢?

[复制链接]
19467|105
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
areshan|  楼主 | 2011-6-13 09:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,为什么在头文件的开头一般都有这样的宏定义呢?
#ifndef   ******
#define  ******



#endif
说是为了定义唯一的宏,但是不怎么能理解!怎么个唯一呢?这个唯一和头文件有什么关系呢?头文件的#include"*****"不就是一个复制包含吗?

相关帖子

来自 2楼
areshan|  楼主 | 2011-6-13 10:16 | 只看该作者
懂了,我以前看到保证是唯一的宏定义,始终没有能理解。其实它就是防止该头文件被多次包含。举个例子,某个文件要用到2个头文件:#include "project.h"和#include"io.h",这两个头文件都是自己定义的,但是每个头文件都包含了#include<reg51.h>的话,是可以的,不会提示重定义,其中就是靠上面的#ifndef #define
#endif完成的!如果你要是把上面的那些去掉的话,就会重定义了,编译就会有警告!
谢谢ayb_ice,和原野之狼的帮助!

使用特权

评论回复
来自 3楼
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 | 只看该作者
防止重复包含同一个文件

使用特权

评论回复
5
原野之狼| | 2011-6-13 09:24 | 只看该作者
那是为了防止对头文件的重复包含。
你说的定义唯一的宏,不知道从哪里看见的资料。

使用特权

评论回复
6
xwj| | 2011-6-13 10:55 | 只看该作者
呵呵,理解了就好,建议斑竹给LS加裤子

使用特权

评论回复
7
原野之狼| | 2011-6-13 11:29 | 只看该作者
呵呵,理解了就好,建议斑竹给LS加裤子
xwj 发表于 2011-6-13 10:55

LZ不但提出了问题 而且还把解决问题的方式做了详细的正确的阐述 所以赠内裤一条:lol

使用特权

评论回复
8
xwj| | 2011-6-13 11:32 | 只看该作者
哈哈,布置LS的斑竹是男是女,LZ又是男是女?

要是一个男人收到男人的内裤....

使用特权

评论回复
9
xwj| | 2011-6-13 11:48 | 只看该作者
哈哈,不知6楼的斑竹是男是女,LZ又是男是女?

要是一个男人收到男人的内裤....

使用特权

评论回复
10
yewuyi| | 2011-6-13 11:56 | 只看该作者
俺一直认为,其实这个包含问题这么处理并不好,重复包含本来就不对,这么做其实是掩盖了问题

使用特权

评论回复
11
xwj| | 2011-6-13 12:40 | 只看该作者
不赞成LS,个人觉得这个是对的,属于条件编译的最典型应用,而不是“掩盖了问题”

使用特权

评论回复
12
mohanwei| | 2011-6-13 12:48 | 只看该作者
用C编过规模大点、文件和模块较多的程序,就会发现这是最好的解决方案,没有“之一”……

使用特权

评论回复
13
鸟鸟| | 2011-6-13 12:56 | 只看该作者
:lol

使用特权

评论回复
14
pentral0311| | 2011-6-13 12:57 | 只看该作者
LS的说的很对,特别是多人多任务交叉编写一个软件工程的时候

使用特权

评论回复
15
ayb_ice| | 2011-6-13 13:23 | 只看该作者
俺一直认为,其实这个包含问题这么处理并不好,重复包含本来就不对,这么做其实是掩盖了问题
yewuyi 发表于 2011-6-13 11:56

我也有这种感觉

使用特权

评论回复
16
sysdriver| | 2011-6-13 13:31 | 只看该作者
以前我挺在意头文件的,但是现在我认为可以不需要头文件.呵呵,有点叛逆啊.

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

当然有特殊情况了,比如系统配置需要的常量太多,配置太多,需要config.h是可以理解的.所以我认为,头文件要看情况决定用不用.

使用特权

评论回复
17
原野之狼| | 2011-6-13 13:32 | 只看该作者
关于这个问题我倒是不同意老叶和ayb_ice两人的看法
有的时候 这个重复包含是不可避免的

使用特权

评论回复
18
yewuyi| | 2011-6-13 13:40 | 只看该作者
关于这个问题我倒是不同意老叶和ayb_ice两人的看法
有的时候 这个重复包含是不可避免的
原野之狼 发表于 2011-6-13 13:32


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

俺自己反正是不喜欢用,当然别的同事用,俺也不反对,只是感觉不必要。

使用特权

评论回复
19
ayb_ice| | 2011-6-13 13:48 | 只看该作者
我的意思是最好程序员自己显示确保不重复包含同一个文件,至少在MCU项目中是很好保证这个条件的,在大型,大型多人合作项目中这个还是很有用的

使用特权

评论回复
20
yewuyi| | 2011-6-13 14:25 | 只看该作者
呵呵,估计现在做应用程序的,用C写大型软件的很少很少了吧。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
nfgkjk + 1
21
xwj| | 2011-6-13 14:26 | 只看该作者
那用什么写?
用D写?
用E写?

使用特权

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

本版积分规则

127

主题

729

帖子

0

粉丝