#define 一个函数的好处?

f15361110801 2012-02-02 11:45:42

#define func(x) ... // 对x进行处理


func(x) // 定义一个函数

有什么分别?
有什么优势与劣势?

谢谢~
...全文
792 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员小迷 2012-02-04
  • 打赏
  • 举报
回复
就是宏和函数的区别
Lactoferrin 2012-02-03
  • 打赏
  • 举报
回复
函数体很大时不要#define,否则空间时间都得不到
wopabe 2012-02-03
  • 打赏
  • 举报
回复 1
前者是宏,只会替代,是在预编译时执行的
而函数是在运行时执行的
所以前者运行比较快
zzzzyu 2012-02-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 f15361110801 的回复:]

在学链表时,
书上定义
struct List{
int size;
......
};
struct List *list;

本该可以用
list->size
来读取信息;

为何书上还用
#define list_size(list) ((list)->size)
那么麻烦呢?
[/Quote]

list->size
这是一个对象的字段的读取
#define list_size(list)
写成一个宏 那就任何对象的传入都可以读同一字段
但是没有类型检查 存在隐患
赵4老师 2012-02-03
  • 打赏
  • 举报
回复
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。
RLib 2012-02-03
  • 打赏
  • 举报
回复
#define这将强制编译器进行内联(不能保证~~),但重复代码可能会增加。



对此,Visual Studio 2011有一项 重复代码分析 功能,听说可以分析代码逻辑,找出重复的代码,方便重构代码。
sagegz 2012-02-02
  • 打赏
  • 举报
回复 2
优点:可完成函数调用的功能,又能减少系统开销,提高运行效率。因为它是在预处理阶段即进行了宏展开,在执行时不需要转换,即在当地执行。
缺点:所占用的目标代码空间相对较大
PS:牺牲空间来换取时间
jzxsasch 2012-02-02
  • 打赏
  • 举报
回复
#define func(x)是替换,它会产生很多问题
问题少点
f15361110801 2012-02-02
  • 打赏
  • 举报
回复
在学链表时,
书上定义
struct List{
int size;
......
};
struct List *list;

本该可以用
list->size
来读取信息;

为何书上还用
#define list_size(list) ((list)->size)
那么麻烦呢?

ProgrammingRing 2012-02-02
  • 打赏
  • 举报
回复
宏速度快~没有类型限制,缺点是不灵活,不知对否- -
欢乐的小熊 2012-02-02
  • 打赏
  • 举报
回复
优势:比函数调用效率高,省去了参数的拷贝,直接替换。
劣势:目标代码空间变大,不利于调试,还可能会导致隐含的错误,如:

#define fun(a) a+a

int a = 2;
fun(a++);
newpuple 2012-02-02
  • 打赏
  • 举报
回复
宏有很多好处,上面说了很多,基本上二楼都说出来了

我说个头疼的缺点,不利于调试,单步调试时根本看不出里面的变化
hu7324829 2012-02-02
  • 打赏
  • 举报
回复
宏 代码在预处理期被简单替换, 类似于C++的内联函数
普通函数 多了申请栈,压栈,出栈,释放栈
AnYidan 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sagegz 的回复:]

优点:可完成函数调用的功能,又能减少系统开销,提高运行效率。因为它是在预处理阶段即进行了宏展开,在执行时不需要转换,即在当地执行。
缺点:所占用的目标代码空间相对较大
PS:牺牲空间来换取时间
[/Quote]

避过了类型,有点泛型的意思,但有副作用。。。
jixiang1983 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sagegz 的回复:]
优点:可完成函数调用的功能,又能减少系统开销,提高运行效率。因为它是在预处理阶段即进行了宏展开,在执行时不需要转换,即在当地执行。
缺点:所占用的目标代码空间相对较大
PS:牺牲空间来换取时间
[/Quote]
楼上说的不错,宏定义牺牲空间换取时间,而且不灵活,不便修改,容易出错

70,040

社区成员

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

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