21ic电子技术开发论坛 单片机与嵌入式系统 侃单片机论坛 #ifndef怎么用呢?
发新帖我要提问
返回列表
打印

#ifndef怎么用呢?

[复制链接]
楼主: areshan
手机看帖
扫描二维码
随时随地手机跟帖
21
yewuyi| | 2011-6-13 14:51 | 只看该作者 回帖奖励 |倒序浏览
那用什么写?
用D写?
用E写?
xwj 发表于 2011-6-13 14:26


至少也是VC\VB了吧!?

使用特权

评论回复
22
mohanwei| | 2011-6-13 15:33 | 只看该作者
VC里用的更多,自动生成的所有C/C++头文件都有,只不过它自动生成的宏太长了,一般人可能会忽略掉

使用特权

评论回复
23
xwj| | 2011-6-13 15:40 | 只看该作者
VC就不是C?
C++就不是C了?
不要用#ifndef?


那Linux算不算是大型软件?

使用特权

评论回复
24
yewuyi| | 2011-6-13 16:01 | 只看该作者
VC就不是C?
C++就不是C了?
不要用#ifndef?


那Linux算不算是大型软件?
xwj 发表于 2011-6-13 15:40


俺接个话茬,洗碗机就吓唬俺,俺就只能跑路咯,俺可真不会什么大型软件,所以真不知道里面用不用#ifndef。。。。。。


俺只是觉得:包含就包含,不包含就不要包含它,刚毕业时看过一个DVD的伺服驱动程序,里面大把大把的#ifndef,绕过来绕过去,结果绕的脑袋都大了,结果俺就落下了心理阴影,自己坚决不用着绕弯的包含。

使用特权

评论回复
25
原野之狼| | 2011-6-13 16:17 | 只看该作者
呵呵 老叶  徐公子发贴的风格就是这样 别被吓坏了:lol
估计老叶曾经被所谓的高手忽悠的落下了阴影 由此可见 忽悠是多么重要的一门技术 都能把叶工忽悠这么多年

实际上 #ifndef是通用的做法 跟软件的大小没有必然的联系

windows桌面软件一般在VC或更高级的VSS下开发  使用的语言是C++
WEB软件一般使用JAVA
开源世界里 对C比较钟爱

使用特权

评论回复
26
lxyppc| | 2011-6-13 16:18 | 只看该作者
VC就不是C?
C++就不是C了?
不要用#ifndef?


那Linux算不算是大型软件?
xwj 发表于 2011-6-13 15:40


VC新点的版本不用#ifndef
而是用#pragma once

使用特权

评论回复
27
mohanwei| | 2011-6-13 16:18 | 只看该作者
如果你早知道简单修改一个宏就可以出来一款新的产品,绝对会如获至宝而不是敬而远之:
//#define PRODUCT_TYPE   可刻录48倍速
#define PRODUCT_TYPE   普通24倍速
//#define PRODUCT_TYPE   普通52倍速
//#define PRODUCT_TYPE   可刻录12倍速
……

如果不这样干,当某个模块代码发现bug改了几行,而同样的模块在几十个项目工程里都分别有一份拷贝,让你维护起来就不是头大那么简单了

使用特权

评论回复
28
电子农民工| | 2011-6-13 16:25 | 只看该作者
#ifndef
#ifdef
#undef
#endif

等预编译命令用在一套代码兼容多个硬件平台中很有用。比如一个公司有很多个机种,大部份硬件是一样的,只是小部份硬件不一样,那么,就可以通过这些命令来做成一套代码兼容多个机种平台。

使用特权

评论回复
29
yewuyi| | 2011-6-13 16:31 | 只看该作者
如果你早知道简单修改一个宏就可以出来一款新的产品,绝对会如获至宝而不是敬而远之:
//#define PRODUCT_TYPE   可刻录48倍速
#define PRODUCT_TYPE   普通24倍速
//#define PRODUCT_TYPE   普通52倍速
//#define P ...
mohanwei 发表于 2011-6-13 16:18


呵呵,这个俺还是常用的,只是不喜欢文件包含时,用#ifndef来避免头文件重复包含的方式。

见过很多人,不管3721,在所有C文件中直接都把H文件包含进去了,然后通过#ifndef来避免重复包含,感觉那有点画蛇添足,当前C文件不需要某个H文件时,不包含就是了,而且如果严格按照H文件只做声明不做变量等的定义,也没什么太多的重复包含问题。

使用特权

评论回复
30
xwj| | 2011-6-13 16:38 | 只看该作者
呵呵,是我错,一不小心又把叶工忽悠了

不过作为一个酒精考验的老电工,叶工应该加强自身的硬件抗忽悠能力:lol

使用特权

评论回复
31
123jj| | 2011-6-13 16:51 | 只看该作者
:lol

使用特权

评论回复
32
原野之狼| | 2011-6-13 16:52 | 只看该作者
呵呵,这个俺还是常用的,只是不喜欢文件包含时,用#ifndef来避免头文件重复包含的方式。

见过很多人,不管3721,在所有C文件中直接都把H文件包含进去了,然后通过#ifndef来避免重复包含,感觉那有点画蛇添足,当 ...
yewuyi 发表于 2011-6-13 16:31

老叶这个理解还是不对 #ifndef并不能解决变量重复定义的问题
#ifndef也跟变量重复定义没有关系
这个问题叶工需要再仔细琢磨一下 你被所谓的高手忽悠惨了:lol

使用特权

评论回复
33
yewuyi| | 2011-6-13 17:08 | 只看该作者
老叶这个理解还是不对 #ifndef并不能解决变量重复定义的问题
#ifndef也跟变量重复定义没有关系
这个问题叶工需要再仔细琢磨一下 你被所谓的高手忽悠惨了:lol ...
原野之狼 发表于 2011-6-13 16:52


呵呵,#ifndef某种程度上是可以防止变量重复定义的,在某些‘大作’中,经常见到。
#ifndef  xxx
#define xxx
unsinged char k1;
#endif
俺也一直弄不明白,为什么有人这些写,这么写到底是为了什么!?
---------------------------------------------------------------------------
对于俺个人来说,不存在变量重复定义的问题,因为俺从来不在H文件中做定义,变量只在C文件中直接定义,H文件中基本只有声明一类的东西。

使用特权

评论回复
34
yewuyi| | 2011-6-13 17:10 | 只看该作者
#ifndef本身和变量定义没有关系,只是一个编译开关而已,所以,俺自己不喜欢用,但也不反对同事们使用。

使用特权

评论回复
35
原野之狼| | 2011-6-13 17:19 | 只看该作者
#ifndef本身和变量定义没有关系,只是一个编译开关而已,所以,俺自己不喜欢用,但也不反对同事们使用。
yewuyi 发表于 2011-6-13 17:10

嗯 老叶此处所说的开关不同于主贴讨论的解决文件重复包含问题所用的开关
至于你引用到的“大作”就不值得讨论了 呵呵:P

使用特权

评论回复
36
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 我很赞同
37
jack_shine| | 2011-6-13 17:38 | 只看该作者
从英文字母理解,假如没有定义就定义之

使用特权

评论回复
38
lifei092| | 2011-6-13 22:45 | 只看该作者
太感谢了!!我正在研究这个问题呢。。。。。。

使用特权

评论回复
39
clingos| | 2011-6-14 08:48 | 只看该作者
:lol

使用特权

评论回复
40
yewuyi| | 2011-6-14 09:12 | 只看该作者
---------------
如果不用#ifndef 防重复技术
那么#include "type.h"不能出现头文件中
而在使用a和b模块的文件中,只能这样写
#include "type.h"
#include "a.h"
#include "b.h"
也就是说,在使用a,b模块的时候,你必须要知道他们使用了哪些公用的头文件,然后按顺序进行include
--------------------
type.h中的声明重复包含难道编译通不过?
type.h
typedef              unsigned int         uint16_t;
a.h
#include "type.h"
b.h
#include "type.h"
c.h
#include "a.h"
#include "b.h"
难道uint16_t会编译通不过!?

使用特权

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

本版积分规则

关闭 热门推荐
快速回复 在线客服 返回列表 返回顶部