社区
C语言
帖子详情
#define 一个函数的好处?
f15361110801
2012-02-02 11:45:42
用
#define func(x) ... // 对x进行处理
和
func(x) // 定义一个函数
有什么分别?
有什么优势与劣势?
谢谢~
...全文
806
16
打赏
收藏
#define 一个函数的好处?
用 #define func(x) ... // 对x进行处理 和 func(x) // 定义一个函数 有什么分别? 有什么优势与劣势? 谢谢~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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]
楼上说的不错,宏定义牺牲空间换取时间,而且不灵活,不便修改,容易出错
#
define
的使用
目录 前言 1.#
define
定义标识符 2. #
define
定义宏 3.#
define
替换规则 4.宏和
函数
对比 前言 在很多C程序中,我们会在
一个
源文件的开头看到#
define
的字眼,和
define
的英文解释相同——可以理解为给xxx下定义,这里可以是标识符甚至是
一个
函数
,接下来的内容将会对#
define
进行详解 1.#
define
定义标识符 使用#
define
可以用来定义标识符,所谓标识符可以简单理解为
一个
能够表示一定内容的符号,其格式为 #定义 标识符...
#
define
用法详解 及#ifndef #
define
#endif 总结
想要知道三者的关系,不得不先说说#
define
宏定义。简单来说#
define
XX ??? 就是在源码编译之前,将代码中XX全部替换成???. #
define
用法一般分以下几种: 1、无参宏定义 形式为:#
define
宏名 字符串 其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“
define
”为宏定义命令。“标识符”为所定义
#
define
宏定义是什么?怎么写?一文搞懂。
###前言 最开始接触宏定义的时候是在学校的C++课程上,当时只是见过它一眼,没有深究,它给我的感觉像定义
一个
变量一样。之后在刷题的过程中接触到了CodeForce平台,里面可以看到每个人提交的代码。于是我惊呆了…… CF的大佬善于定义各种各样的宏,比如这样的: #
define
FOR(i,a,b) for (int i = (a); i < (b); ++i) /* 当然,这段代码并不规范,举个例子 */ 再比如这样的: #
define
False 1 #
define
True 0 甚至可以这样
【C语言】#
define
宏与
函数
的优劣对比
#
define
预处理指令 #
define
宏 #
define
标识符 宏与
函数
的对比 宏的优点缺点
函数
的优点缺点
#
define
宏和
函数
(C语言)
宏和
函数
C语言
70,035
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章