| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1942 人关注过本帖
标题:关于#define的疑问
只看楼主 加入收藏
redersun
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-6-6
收藏
 问题点数:0 回复次数:10 
关于#define的疑问
教材上都说#define的使用格式是:#define 宏名 字符串
这样就可以用宏名来代替后面的字符串,可我却发现好多程序都采用:#define 宏名的格式来定义宏,即没有字符串,不知道这种定义有什么用啊,一般用在什么情况下?

下面是我从一个程序中看到的:

#define PJ_ETIMEDOUT      /* 后面省略了字符串,到底是要说明什么意思,有什么用? */
#define PJ_EUNKNOWN
#define pj_assert(expr)   /* 这个还有一个参数,又该怎么理解? */
#define PJ_ASSERT_RETURN(expr, retval) /* 这个成两个参数了? */
#define PJ_MAX_HOSTNAME (128)       /*既然都说宏就是替换为什么还要加括号?*/
#define PJ_EQUEUE_PENDING (-2)
#define PJ_RETURN_OS_ERROR(os_code)
#define PJ_STATUS_FROM_OS(e)
#define PJ_STATUS_TO_OS(e)

等等……,还有很多,我就不再粘贴了

[[it] 本帖最后由 redersun 于 2008-10-8 20:34 编辑 [/it]]
搜索更多相关主题的帖子: define 疑问 
2008-10-08 20:01
liaker
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-4-13
收藏
得分:0 
应该是个空语句!
2008-10-08 20:07
redersun
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-6-6
收藏
得分:0 
有时候宏名后面还带参数,我感觉人家这样写代码肯定有用,不该是空语句啊
2008-10-08 20:24
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
收藏
得分:0 
并不是空语句
#ifndef _STDIO_H_
#define    _STDIO_H_
(摘自stdio.h)
看出用处了么?没错,就是防止头文件被重复包含,宏被重复定义。
先定义一些有标识意义的宏,然后就可以根据检查标识宏来判断,以下内容是否被定义

当对C的经验增加时,它会显的很好用.----Dennis M Ritche如是说
2008-10-08 20:32
lingluoz
Rank: 2
来 自:苏州科技学院
等 级:新手上路
威 望:4
帖 子:749
专家分:0
注 册:2008-2-2
收藏
得分:0 
好好看书啊 书中这些都有的啊

Murphy's Law :
If there are two or more ways to do something, and one of those ways can result in a catastrophe, then someone will do it.
2008-10-08 20:32
redersun
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-6-6
收藏
得分:0 
非常感谢几位朋友热心回复,可后面带参数的却又省略了字符串的define又是什么意思呢?

#define 宏名
的形式仅仅是用来防止重复包含吗?

[[it] 本帖最后由 redersun 于 2008-10-8 20:39 编辑 [/it]]
2008-10-08 20:37
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
收藏
得分:0 
#define PJ_MAX_HOSTNAME (128)
这个是宏最正宗的用法。注意中间有括号,就是把PJ_MAX_HOSTNAME定义为128,宏里面的内容一般都是有括号的。
#define PJ_RETURN_OS_ERROR(os_code)
至于这种,建议你仔细看看到底程序的哪些部分用了这个定义

当对C的经验增加时,它会显的很好用.----Dennis M Ritche如是说
2008-10-08 20:43
redersun
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-6-6
收藏
得分:0 
关于#define pj_assert(expr),找到一段说明
#define pj_assert(expr)
Check during debug build that an expression is true. If the expression computes to false during run-time,
then the program will stop at the offending statements. For release build, this macro will not do anything.
Parameters:
expr The expression to be evaluated.

这段话该怎么理解呢?
2008-10-08 20:54
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
收藏
得分:0 
在debug时检查这个语句是否为真,如果在运行语句时为假,程序会在有问题的语句停止。发行版本中这个宏没有任何用处。
参数:expr 待检查的表达式

当对C的经验增加时,它会显的很好用.----Dennis M Ritche如是说
2008-10-08 21:09
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
得分:0 
回复 6# redersun 的帖子
有些空宏仅仅是为了增加代码的可读性。例如标示参数传输方向的IN, OUT
2008-10-08 21:20
快速回复:关于#define的疑问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016386 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved