CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

顷分相送!(什么是宏??)

楼主girlsjj(Lilain)2002-04-26 14:43:05 在 VC/MFC / 基础类 提问

什么是宏?  
  请给出详细解答!!  
  45分送!! 问题点数:45、回复次数:11Top

1 楼winhero()回复于 2002-04-26 14:50:32 得分 0

就是用#define语句定义的东西,如#define   TURE   1,则程序中所有出现TURE的地方,在编译时都用1替换.Top

2 楼morningsing(奈何)回复于 2002-04-26 14:59:08 得分 10

宏语句在预编译的时候被处理,也就是在预编译时被宏体所替代。  
  它在某些地方与函数相似,但可省去函数调用的代价,但是代码长度会大一些。因为不管宏语句在代码中出现了多少次,每次都被完整的宏体所替代,而函数码在程序中只存在一次就可以了。Top

3 楼girlsjj(Lilain)回复于 2002-04-26 15:05:40 得分 0

那一般都用于什么地方?  
  利用宏解决什么问题??  
  (可加分!)Top

4 楼Sorcier(小巫师)回复于 2002-04-26 15:17:15 得分 0

MACRO一般用于简化一些烦琐又相同的操作步骤。   一般在   office   系列里用的比较多  
  Top

5 楼zhwangquan(聪明的大傻瓜)回复于 2002-04-26 15:18:34 得分 0

避免函数调用使用堆栈,以及参数入栈出栈占用CPU时间Top

6 楼fire_zxv(辉)回复于 2002-04-26 15:26:52 得分 0

MFC的  
  BEGIN_MESSAGE_MAP  
  END_MESSAGE_MAP  
  DECLARE_MESSAGE_MAP  
  消息映射就是对宏的经典应用Top

7 楼fhbkyo(光荣潜水员)回复于 2002-04-26 15:34:00 得分 0

定义一个变量为一个特定的值Top

8 楼free_free(free_free)回复于 2002-04-26 15:35:33 得分 10

宏是一段完成特定功能的代码和C++的内联函数相似  
   
  与函数的区别,是宏将代码复制到调用处,而函数是转去执行,如调用10次,则宏的代码被复制10次,而函数的代码只有一份。使用宏的速度快,但程序较大,使用函数程序较小,但相对速度要慢。  
   
  所以比较短小又使用频繁的功能适合做成宏,而相对大些的写成函数。  
   
  Top

9 楼lixiner(大汤姆狼)回复于 2002-04-26 15:41:33 得分 0

说一点   我自己的看法,请斧正!  
  为完成一定功能   例如:动态类型检验、串行化、消息循环  
  需要   为已有类添加各项支持  
  为使用户使用方便,就用#define简化为相关宏  
  宏大多用在比较通用的功能,一方面方便了用户  
  一方面也隐藏了实际操作  
  有时让人摸不到头脑Top

10 楼morningsing(奈何)回复于 2002-04-26 15:42:53 得分 10

关于宏用在什么地方:  
  其实这个东西的使用更多的是因为传统的原因,现在很多的C++专家都不推荐使用宏。因为它在编译前就被替换掉了,所以不具备类型安全的特性。  
  它的类似函数的功能可以用inline函数实现;定义常量的功能可以有const代替。Top

11 楼steedhorse(晨星)回复于 2002-04-26 15:53:55 得分 15

就是一些在编译时首先处理的替换规则。  
   
  比如  
  #define   NUMBER   8  
  那么,在编译开始时,编译器将首先把该源文件中的NUMBER全部换成8。  
  所以,你千万别定义  
  #define   n   8,  
  那样一来,文件中所有的晓小字母n将全被换成8。  
   
  当然,还有类似函数的替换,  
  比如,  
  #define   PRINT(INT)   printf("%d\n"   ,   INT)  
  后面就可以使用PRINT(i)来打印i的值了。  
  但你同样需要注意,不能图简介,来一个  
  #define   PRINT(n)   printf("%d\n"   ,   n)  
  那样一来,当调用PRINT(8)时,编译器会把它替换成:  
  pri8tf("%d\8"   ,   8)  
  明白了吧,宏定义执行的仅仅是简单的字符串替换。  
  当然,还有个问题需要注意,比如,你自己定义一个乘法宏:  
  #define   PRODUCT(M   ,   N)   M*N  
  后面,你调用PRODUCT(3+2   ,   5+4)  
  会被编译器替换成:  
  3+2*5+4,你本来想得到45,却得到了17。  
  所以上面的宏应该定义成  
  #define   PRODUCT(M   ,   N)   (M)*(N)  
   
  宏定义主要就是上述的这两类:带参数的宏定义和不带参数的宏定义,有时候还会用到仅仅定义一个字符串,却不定义成任何东西的情况。如:  
  #define   _DEBUG  
  这样的宏定义主要用来做条件编译。  
  比如,你调试程序的时候,可能会让程序输出许多中间结果,你就可以在前面来一个#define   _DEBUG,然后把这些输出语句都编程下面的形式。  
  #ifdef   _DEBUG  
          printf("%d"   ,   tmp);  
  #endif  
  这样,等你的程序调试得差不多了,要发布了,不再需要输出这些中间结果了,你只需把文件头上的那句:  
  #define   _DEBUG  
  注释掉,再编译一遍,就一些搞定了。  
  关于条件编译的知识,你还是找本书自己看看吧,随便一本C/C++书上都有,当然VC的编译预处理还要复杂的多。Top

相关问题

  • 100分,在线等,问关于DECLARE_DYNCREATE(CLASSNMAE)宏的相关问题。
  • 高分寻找“宏宇”
  • delphi和excel宏高手请进!!(高分!!!!!!!!!!!)
  • 宏的问题,分数大大的!!!
  • RedHat和Debian用什么宏来区分
  • 请问“宏”是什么?和宏病毒有关系吗?(来着有分)
  • 100分征求一个宏定义,关于宏参数的,有点难度!?
  • 关于 VC TRACE() 宏问题.菜鸟送分啦!
  • 如何编制这个宏? 解决一定送分
  • ???TEXT宏里面如何换行????参与者有分

关键词

  • c++
  • 函数
  • 编译
  • 代码
  • 编译器
  • 语句
  • debug
  • 宏
  • 定义
  • 调用

得分解答快速导航

  • 帖主:girlsjj
  • morningsing
  • free_free
  • morningsing
  • steedhorse

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo