千家信息网

什么是宏定义函数

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章将为大家详细讲解有关什么是宏定义函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在预处理时,对程序中所有出现的"宏名",都用宏定义中的字符串
千家信息网最后更新 2025年12月02日什么是宏定义函数

这篇文章将为大家详细讲解有关什么是宏定义函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

在预处理时,对程序中所有出现的"宏名",都用宏定义中的字符串去代换,这称为"宏代换"或"宏展开"。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。若字符串是表达式,我们称之为函数式宏定义。

我们以下面两行代码为例,展开描述:

函数式宏定义:#define MAX(a,b) ((a)>(b)?(a):(b))

普通函数 :MAX(a,b) { return a>b?a:b;}

(1)函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心。

(2)函数式宏定义要注意格式,尤其是括号。

若上面的宏定义式函数写成#define MAX(a,b) (a>b?a:b)省去内层括号,宏展开后由于运算符优先级,运行结果出错;若上面的宏定义式函数省去外层括号,宏定义为 ++MAX(a,b),则宏展开就成了 ++(a)>(b)?(a):(b),运算优先级也是错了。

(3)若函数参数为表达式,则普通函数的调用与函数式宏定义的替换过程是不一样的。

普通函数调用时先求实参表达式的值再传给形参,如果实参表达式有Side Effect,那么这些SideEffect只发生一次。例如MAX(++a, ++b),如果MAX是普通函数,a和b只增加一次。但如果MAX函数式宏定义,则要展开成k = ((++a)>(++b)?(++a):(++b)),a和b就不一定是增加一次还是两次了。所以若参数是表达式,替换函数式宏定义时一定要仔细看好。

(4)调用真正函数的代码和调用函数式宏定义的代码编译生成的指令不同。

如果MAX是个普通函数,那么它的函数体return a > b ? a : b; 要编译生成指令,代码中出现的每次调用也要编译生成传参指令和call指令。而如果MAX是个函数式宏定义,这个宏定义本身倒不必编译生成指令,但是代码中出现的每次调用编译生成的指令都相当于一个函数体,而不是简单的几条传参指令和call指令。所以,使用函数式宏定义编译生成的目标文件会比较大。

优势:

首先,函数调用会带来额外的开销,它需要开辟一片栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈,这种开销会降低代码效率,而使用宏定义则在代码规模和速度方面比函数更胜一筹;

其次,函数的参数必须被声明为一种特定的类型,所以它只能在类型合适的表达式上使用,我们如果要比较两个浮点型的大小,就不得不再写一个专门针对浮点型大小的比较函数,反之,上面的宏定义可以用于整型、长整型、单浮点型、双浮点型及其他可以用"<"操作符比较值大小的类型,也就是说,宏与类型无关。

关于什么是宏定义函数就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

函数 指令 代码 类型 表达式 生成 编译 普通 参数 浮点 大小 括号 面的 预处理 优先级 内容 字符 字符串 开销 文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 优炫数据库和拓尔思 网络安全法第二百五十三条规定 英雄联盟最新服务器位置 数据库跨行怎么设置 山东特色软件开发诚信推荐 国产服务器网络机柜价格 r语言数据框存数据库 数据库防护安全手段 soul各个星球数据库一样吗 喷泉模型是软件开发模型吗 中国土壤重金属数据库 济南招聘软件开发员 天津爱福生软件开发 焦点科技互联网南京排名 海南气象服务器 海康服务器电视墙如何配置 特斯拉软件开发如何 福州中旭网络技术公司招聘 天象网络技术骗局 资讯 广州渠道无忧网络技术服务 奥兰多游戏软件开发工具公司 威科法律数据库贵吗 网络安全登记保护备案指南 南昌风火轮网络技术有限公司 服务器通用防护办法 asp个人服务器软件 新交互服务器地址 周村企业管理软件开发报价 方舟服务器隐藏管理员代码 苏州办公系统软件开发哪里有
0