宏和函数

Jerrylearnc 2008-08-08 07:35:08
最近遇到两个概念
宏和函数
这两个有什么区别呢?

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

这是在单片机里看到的
...全文
373 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ya6100479 2008-08-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 Jerrylearnc 的帖子:]
最近遇到两个概念
宏和函数
这两个有什么区别呢?

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

这是在单片机里看到的
[/Quote]
pigHead_chen 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dding_inshili 的回复:]
宏和函数有着本质的区别:
1,函数是在运行是分配临时内存空间的, 而宏是在编译阶段展开的,另外, 在展开的时候并不分配内存空间,也不进行值的传递, 更是没有什么返回值。
2,函数调用是先求出实参表达式,然后带入形参; 而宏只是进行简单的字符串替代。
3,函数的形参的参数类型有着严格的规定, 而宏中的参数是不严格的。
4,函数的调用过程要占用一系列处理时间,而宏的展开只占用编译时间,不占用运行时间。

[/Quote]

你问宏和内联函数的区别会更有意义些。一楼回答很全面。
csgdseed 2008-08-08
  • 打赏
  • 举报
回复
书上都有
xianyuxiaoqiang 2008-08-08
  • 打赏
  • 举报
回复
宏就是让编译器去玩文字游戏。比如

#define a(b) b+b


void main(){
....
a(x*y);//编译器会把它变成 x*y+x*y
....

}
eatsweetpotato 2008-08-08
  • 打赏
  • 举报
回复
宏与类型无关,还有宏中的参数不能有副作用
realdragon2 2008-08-08
  • 打赏
  • 举报
回复
补充:
宏分两种,一种是带参数的,一种是不带参数的. 只有带参数的宏才有必要和函数进行比较.

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

另外, 在调用的时候(形式上和函数的调用类似),如果传递给它的是一表达式, 则表达式不进行运算,而直接代入对应的字符, 所以在定义有参数宏的时候一定要记着用括号括起每个字符来.
dongw1023 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dding_inshili 的回复:]
宏和函数有着本质的区别:
1,函数是在运行是分配临时内存空间的, 而宏是在编译阶段展开的,另外, 在展开的时候并不分配内存空间,也不进行值的传递, 更是没有什么返回值。
2,函数调用是先求出实参表达式,然后带入形参; 而宏只是进行简单的字符串替代。
3,函数的形参的参数类型有着严格的规定, 而宏中的参数是不严格的。
4,函数的调用过程要占用一系列处理时间,而宏的展开只占用编译时间,不占用运行时间。

[/Quote]
在程序中调用时,宏是简单的代码替换
K行天下 2008-08-08
  • 打赏
  • 举报
回复
宏在编译阶段直接展开替代,一般适应于小型的函数,提高效率
lunarfan 2008-08-08
  • 打赏
  • 举报
回复
还有从时间上来说宏是在编译前也就是预处理时候展开替换,函数只有在调用他的时候分配内存执行的。
lunarfan 2008-08-08
  • 打赏
  • 举报
回复
宏是纯替换不涉及实参形参传递问题,对于频繁调用的小型函数用宏比较有效率,
babyvox1999 2008-08-08
  • 打赏
  • 举报
回复
baidu google
dding_inshili 2008-08-08
  • 打赏
  • 举报
回复
宏和函数有着本质的区别:
1,函数是在运行是分配临时内存空间的, 而宏是在编译阶段展开的,另外, 在展开的时候并不分配内存空间,也不进行值的传递, 更是没有什么返回值。
2,函数调用是先求出实参表达式,然后带入形参; 而宏只是进行简单的字符串替代。
3,函数的形参的参数类型有着严格的规定, 而宏中的参数是不严格的。
4,函数的调用过程要占用一系列处理时间,而宏的展开只占用编译时间,不占用运行时间。

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

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

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

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧