社区
C语言
帖子详情
#define 一个函数的好处?
f15361110801
2012-02-02 11:45:42
用
#define func(x) ... // 对x进行处理
和
func(x) // 定义一个函数
有什么分别?
有什么优势与劣势?
谢谢~
...全文
829
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]
楼上说的不错,宏定义牺牲空间换取时间,而且不灵活,不便修改,容易出错
const基础const符号表机制&&const和#
define
的对比
1、const基础知识(用法、含义、
好处
)⑴初级理解:const是定义常量==》意味着只读#include<iostream> structTeacher { charname[64]; intage; } intoperatorTeacher01(constTeacher*pT) { pT->age=10;/...
C++ : 尽量以const、enum、inline替换#
define
使用cosnt替代#
define
的
好处
是,1. 当程序出现编译错误时,程序会给出出错的变量名。如果采用预处理宏,宏名在预处理时被预处理器替换掉,宏名无法进入到程序的字符表中,因此在程序报错时只会给出错误处的数值。2. 当程序采用const变量时,程序中只会存储此变量的一份存储,当采用宏定义时,程序中会出现多处存储。取地址的合法性:取const变量的地址址合法,取enum变量的地址不合法,取#d...
Effective C++ T02:尽量以const、enum、inline替代 #
define
对于单纯常量,最好用const对象和enum替换#
define
对于形似
函数
的宏,最好改用inline
函数
替代#
define
条款1:尽量用const和inline而不用#
define
条款1:尽量用const和inline而不用#
define
这个条款最好称为:“尽量用编译器而不用预处理”,因为#
define
经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句: #
define
ASPECT_RATIO 1.653编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入
Effective C++ 条款27: 尽量用const、enum、inline替换 #
define
Effective_C++_27
C语言
70,040
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章