9251|12

557

帖子

0

TA的资源

裸片初长成(初级)

楼主
 

请教:如何理解 只有宏名的 #define语句 [复制链接]

   #define命令中,总是有两个相关的部分:<宏名>和后面与这个宏名对应的<字符串>或<宏体>。在学习阅读一些程序时,发现有些不带后面部分,而只有<宏名>的#define 语句

    下面这段取自 vivi\include\的config.h:

1        #ifndef _CONFIG_H_
2        #define _CONFIG_H_
3        #include "autoconf.h"
4        #endif /* _CONFIG_H_ */

   其中第2句就没有后面的部分。 根据上面语句之间的关系,我有这样的理解:
1、 这里关心的只是 _CONFIG_H_这个宏是否存在(是否定义过),而对它的内容用不着关心,因此就可以舍去不写;
2、 而且这样的定义和表达只是在预处理过程中使用,而不进入实际程序中。

    下面这段取自autoconf.h中,也存在两句存在同样情况。


#define AUTOCONF_INCLUDED
……
#ifndef _VIVI_MACHINE_H_
#define _VIVI_MACHINE_H_

#include "config.h"
……
#endif /* _VIVI_MACHINE_H */

[ 本帖最后由 xiaoxif 于 2009-11-25 01:52 编辑 ]

最新回复

呵呵。我说的不是混乱代码大赛。而是指正常的编程中宏定义的应用。特别是当编程作为一个工程时,宏定义的编写甚至超过了代码的编写。我记得我一个老师给我说。“编程并不是让你写代码。而是写定义、数据结构和注释,这些写好了。你的程序就完成了” [ 本帖最后由 leang521 于 2009-11-30 19:46 编辑 ]  详情 回复 发表于 2009-11-30 19:44
点赞 关注
个人签名为什么总用3/4号仿宋? 答:大点清楚‘,仿宋是工程图的标准字体。

回复
举报

515

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
路过看看,确实还可以的,在实际中要运用运用!
 
 

回复

2771

帖子

0

TA的资源

裸片初长成(中级)

板凳
 
1,防止红被重复定义,出现错误!
2,条件编译,如果没有红定义,则定义一个宏,并包含头文件再编译,如果已经定义,则不包含头文件再编译.
 
 
 

回复

274

帖子

0

TA的资源

五彩晶圆(中级)

4
 
也来学习学习。
 
个人签名学无先后,达者为师
 
 

回复

1672

帖子

0

TA的资源

裸片初长成(初级)

5
 
这种语句其实只是设定一个标记。一般用在防止头文件重复include引起的重复定义问题。
假如有个头文件内容为

extern int foo (int arg1, int arg2);

如果被include两次,编译器会报告foo函数重复定义。但如果改成这样:
#ifndef _FOO_H_
#define _FOO_H_
extern int foo (int arg1, int arg2);
#endif

那么,第二次include这个文件的时候,由于_FOO_H_已经定义,所以ifndef里面框起来的内容编译器会忽略掉了,也就避免了出现重复定义的错误。
这种条件编译只是个预防措施,实际工程上还是要理顺头文件的依赖关系,避免重复include文件才是最严谨的做法。
 
 
 

回复

108

帖子

0

TA的资源

一粒金砂(高级)

6
 
版主解释得很详细啊
 
 
 

回复

1672

帖子

0

TA的资源

裸片初长成(初级)

7
 

回复 6楼 dengjieee 的帖子

尽义务,必需的~
 
 
 

回复

557

帖子

0

TA的资源

裸片初长成(初级)

8
 

交上我的作业

谢谢jxb01033016和richiefang二位先生。

我得到的收获是: 不能只注重某语句本身,更要从过程的前后关系及目的和作用上去理解和掌握 。

再请教Mr richiefang:
可否把这句话"一般用在防止头文件重复include引起的重复定义问题",这是针对我提问的举例回答的,那么可否更宽泛的继续理解为。"一般用在防止头文件中诸如include引起的重复定义问题》。
如先生的举例(函数定义):

#ifndef _FOO_H_                              
#define _FOO_H_
extern int foo (int arg1, int arg2);
#endif

[ 本帖最后由 xiaoxif 于 2009-11-25 12:35 编辑 ]
 
个人签名为什么总用3/4号仿宋? 答:大点清楚‘,仿宋是工程图的标准字体。
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

9
 
关于宏定义可以出一本书。这里讲到的只是冰山一角
 
 
 

回复

1672

帖子

0

TA的资源

裸片初长成(初级)

10
 

回复 8楼 xiaoxif 的帖子

一般如果头文件有重复的语句,并不可怕,编译器会指出错误所在。
例如,前面有定义宏
#define spin_lock spinlock_lock
后面再定义
#define spin_lock SPINLOCK

那么编译器会指出前一个重复定义的地方,排错时只需要删除一个即可。
而重复include头文件往往是因为没有理顺头文件依赖关系导致的问题,如在一个.h中又include了别的.h,如此嵌套多重以后很容易出错,并且编译器会指出大量错误,很眼晕(显然,因为重复的不是几个单独的语句而是整个文件,可以多达成千上万个重复定义)
因此,我们在写.h文件时使用这种条件编译的方法,来规避重复include造成的编译错误,但这不是根本解决之道。根本解决之道还是理顺头文件依赖关系,严禁在.h中再include别的.h,除非有一个总的公用.h,在里面include一些在当前系统下编程所必需的.h。如Windows下编程用的windows.h。
 
 
 

回复

1672

帖子

0

TA的资源

裸片初长成(初级)

11
 
原帖由 leang521 于 2009-11-25 12:08 发表
关于宏定义可以出一本书。这里讲到的只是冰山一角

嗯,适当运用宏定义可以写出匪夷所思的代码,这也引发了C语言混乱代码大赛的诞生。
 
 
 

回复

1908

帖子

7

TA的资源

五彩晶圆(高级)

12
 

看高手过招,受益匪浅啊

不错不错
 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

13
 
原帖由 richiefang 于 2009-11-26 09:58 发表

嗯,适当运用宏定义可以写出匪夷所思的代码,这也引发了C语言混乱代码大赛的诞生。

呵呵。我说的不是混乱代码大赛。而是指正常的编程中宏定义的应用。特别是当编程作为一个工程时,宏定义的编写甚至超过了代码的编写。我记得我一个老师给我说。“编程并不是让你写代码。而是写定义、数据结构和注释,这些写好了。你的程序就完成了”

[ 本帖最后由 leang521 于 2009-11-30 19:46 编辑 ]
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表