首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 宏和函数 [已结贴,结贴人:Jerrylearnc]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Jerrylearnc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-08 07:35:08 楼主
    最近遇到两个概念
    宏和函数
    这两个有什么区别呢?

    还有就是固有函数生成内嵌代码运行库程序  是什么意思

    这是在单片机里看到的
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dding_inshili
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-08 07:53:181楼 得分:10
    宏和函数有着本质的区别:
    1,函数是在运行是分配临时内存空间的, 而宏是在编译阶段展开的,另外, 在展开的时候并不分配内存空间,也不进行值的传递, 更是没有什么返回值。
    2,函数调用是先求出实参表达式,然后带入形参; 而宏只是进行简单的字符串替代。
    3,函数的形参的参数类型有着严格的规定, 而宏中的参数是不严格的。
    4,函数的调用过程要占用一系列处理时间,而宏的展开只占用编译时间,不占用运行时间。

    例子:
    #define  max(a, b)  (  (a>b)?a:b  )  /*宏*/

    int  max(int a, int b);                /*函数的声明*/
    ...................
    ...................

    int  max(int a, int b)                  /*函数的实现部分*/
    {
    ...........
    }

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • babyvox1999
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-08 08:24:092楼 得分:0
    baidu google
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hkfybnjt
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-08 08:43:583楼 得分:0
    该回复于2008-08-08 09:12:05被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lunarfan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-08 09:55:394楼 得分:0
    宏是纯替换不涉及实参形参传递问题,对于频繁调用的小型函数用宏比较有效率,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lunarfan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-08 09:57:395楼 得分:0
    还有从时间上来说宏是在编译前也就是预处理时候展开替换,函数只有在调用他的时候分配内存执行的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • k2eats
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-08 10:12:036楼 得分:10
    宏在编译阶段直接展开替代,一般适应于小型的函数,提高效率
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dongw1023
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-08 10:15:217楼 得分:0
    引用 1 楼 dding_inshili 的回复:
    宏和函数有着本质的区别:
    1,函数是在运行是分配临时内存空间的, 而宏是在编译阶段展开的,另外, 在展开的时候并不分配内存空间,也不进行值的传递, 更是没有什么返回值。
    2,函数调用是先求出实参表达式,然后带入形参; 而宏只是进行简单的字符串替代。
    3,函数的形参的参数类型有着严格的规定, 而宏中的参数是不严格的。
    4,函数的调用过程要占用一系列处理时间,而宏的展开只占用编译时间,不占用运行时间。


    在程序中调用时,宏是简单的代码替换
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • realdragon2
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-08 10:23:178楼 得分:0
    补充:
    宏分两种,一种是带参数的,一种是不带参数的. 只有带参数的宏才有必要和函数进行比较.

    带参数的宏的参数不是变量,而函数的参数(不管是本身的形参还是传递给它的实参)是变量.

    另外, 在调用的时候(形式上和函数的调用类似),如果传递给它的是一表达式, 则表达式不进行运算,而直接代入对应的字符, 所以在定义有参数宏的时候一定要记着用括号括起每个字符来.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • eatsweetpotato
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-08 10:28:369楼 得分:0
    宏与类型无关,还有宏中的参数不能有副作用
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianyuxiaoqiang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-08 10:35:5210楼 得分:0
    宏就是让编译器去玩文字游戏。比如
    C/C++ code
    #define a(b) b+b void main(){ .... a(x*y);//编译器会把它变成 x*y+x*y .... }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • csgdseed
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-08 11:34:4011楼 得分:0
    书上都有
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • pigHead_chen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-08 11:47:1312楼 得分:0
    引用 1 楼 dding_inshili 的回复:
    宏和函数有着本质的区别:
    1,函数是在运行是分配临时内存空间的, 而宏是在编译阶段展开的,另外, 在展开的时候并不分配内存空间,也不进行值的传递, 更是没有什么返回值。
    2,函数调用是先求出实参表达式,然后带入形参; 而宏只是进行简单的字符串替代。
    3,函数的形参的参数类型有着严格的规定, 而宏中的参数是不严格的。
    4,函数的调用过程要占用一系列处理时间,而宏的展开只占用编译时间,不占用运行时间。



    你问宏和内联函数的区别会更有意义些。一楼回答很全面。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ya6100479
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 20:28:2013楼 得分:0
    引用楼主 Jerrylearnc 的帖子:
    最近遇到两个概念
    宏和函数
    这两个有什么区别呢?

    还有就是固有函数生成内嵌代码运行库程序  是什么意思

    这是在单片机里看到的
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved