函数宏的优缺点

几种特殊的函数宏封装方式 1函数宏介绍函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。函数宏本质上为宏,可以直接进行定义,例如:#defin... 阅读详情

         老的C语言程序员中有一种倾向,就是把很短的执行频繁的计算写成宏,而不是定义为函数。完成I / O的g e t c h a r,做字符测试的i s d i g i t都是得到官方认可的例子。人们这样做最根本的理由就是执行效率:宏可以避免函数调用的开销。实际上,即使是在C语言刚诞生时(那时的机器非常慢,函数调用的开销也特别大),这个论据也是很脆弱的,到今天它就更无足轻重了。有了新型的机器和编译程序,函数宏的缺点就远远超过它能带来的好处。

  避免函数宏。在C++ 里,在线函数更削减了函数宏的用武之地,在J a v a里根本就没有宏这种东西。即使是在C语言里,它们带来的麻烦也比解决的问题更多。

  函数宏最常见的一个严重问题是:如果一个参数在定义中出现多次,它就可能被多次求值。如果调用时的实际参数带有副作用,结果就会产生一个难以捉摸的错误。下面的代码段来自某个,其意图是实现一种字符测试:

    #define isupper(c) ((C) >=’A’ && (C) <=’Z’)

  请注意,参数c在宏的体里出现了两次。如果i s u p p e r在下面的上下文中调用:While (isupper(C=getchar()))

  那么,每当遇到一个大于等于A的字符,程序就会将它丢掉,而下一个字符将被读入并去与Z做比较。C语言标准是仔细写出的,它允许将i s u p p e r及类似函数定义为宏,但要求保证它们的参数只求值一次。因此,上面的实现是错误的。

  直接使用c t y p e提供的函数总比自己实现它们更好。如果希望更安全些,那么就一定不要嵌套地使用像g e t c h a r这种带有副作用的函数。我们重写上面的测试,把一个表达式改成两个,这里还为捕捉文件结束留下机会:

  While ((C = getchar()) != EOF && isupper(C))

  有时多次求值带来的是执行效率问题,而不是真正的错误。考虑下面这个例子:

   #define ROUND_TO_INT(x) ((int) ((X) +(((X)>0)?0.5:- 0.5)))

  Size= ROUND_TO_INT(sqrt(dx*dx+dy*dy))

  这种写法使平方根函数的计算次数比实际需要多了一倍。甚至对于很简单的实际参数,像R O U N D T O I N T体这样的复杂表达式也会转换成许多指令。这里确实应该把它改成一个函数,在需要时调用。宏将在它每次被调用的地方进行实例化,结果会导致被编译的程序变大( C + +的在线函数也存在这个缺点)。

  给宏的体和参数都加上括号。如果你真的要使用函数宏,那么请特别小心。宏是通过文本替换方式实现的:定义体里的参数被调用的实际参数替换,得到的结果再作为文本去替换原来的调用段。这种做法与函数不同,常给人带来一些麻烦。假如square是个函数,表达式:

  1/ square(x)

  的工作将很正常。而如果它的定义如下:

  #define square(x) (x)*(x)

  上面表达式将被展开成一个错误的内容:

  1/(x)*(x)

  这个宏应该定义为:

   #define square(X) ((x)*(x))

  这里所有的括号都是必需的。即使是在宏定义里完全加上括号,也不可能解决前面所说的多次求值问题。所以,如果一个操作比较复杂,或者它很具一般性,值得包装起来,那么还是应该使用函数。

  C++ 提供的在线函数既避免了语法方面的麻烦,而且又可得到宏能够提供的执行效率,很适合用来定义那些设置或者提取一个值的短小函数。

MATLAB小白也能搞定!BCT脑网络分析工具箱安装与入门指南 本文为零基础用户提供了一份详尽的BCT脑网络分析工具箱安装与入门指南。从MATLAB环境配置、BCT工具箱下载与路径添加,到连接矩阵构建、节点度与聚类系数等基础指标计算,手把手带领神经科学研究者跨越编程门槛,快速掌握脑影像数据分析的核心流程。 阅读详情

相关推荐

Transformer论文解读

Transformer有多牛逼不用多说,时隔7年我们再来看看论文原文,看看这篇深刻改变世界的文章都说了什么。当然逐字逐句解读已经意义不大,我们只列考点。

xian0710830114的专栏 4405

宏的优缺点以及解决办法

宏常量:为了实现简单,会定义宏常量 优点:1.一改全改,2.降低出错率,3.可读性高, 缺点:在预处理阶段进行替换,不会进行类型检测,安全性低(如果写错因为在预处理阶段不会在文件定义宏处报错,而会在使用处报错); 建议:尽量使用const修饰的常量替换宏常量 宏函数: 优点: 1.不是函数,少了函数调用,提高程序运行效率, 2.少写代码:因为宏函数是多条语句的封装—注意:不能提高代码复用率,因为宏函数在预处理阶段就展开了 3.可以提高代码的可读性 缺点: 1.在预处理阶段被替换,不会进行类型检测,代码安全性

Alice_lihao的博客 3363

【实用运维脚本】Windows 批量 TCP 端口检测(tcping 一键巡检)

摘要:本文介绍一款高效的Windows批量TCP端口检测脚本,适配tcpingv0.39工具,实现多服务器一键巡检。脚本具有进度可视化、双日志输出、自动容错等优势,支持注释行过滤和UTF-8编码。 使用仅需三步: 1)下载tcping工具 2)编辑目标列表 3)运行脚本即可自动检测并生成带编号的检测报告。 该方案解决了手动检测效率低、易遗漏的问题,特别适合日常运维中的端口连通性检查,实测稳定可靠,开箱即用。

蕲士|D365 & 服务器运维,心有东坡,行稳致远。 798

关于函数式宏和普通函数

1. 最近工作中的runfunction和面试中

u011370933的专栏 1022

深信服aCloud虚拟存储VS3.0实战:从数据分片到仲裁机制的全流程解析

本文深度解析了深信服aCloud虚拟存储VS3.0的核心架构与生产级实践。从数据分片、条带化写入、多副本机制到智能缓存分层,详细阐述了其如何实现高性能与高可靠性的平衡。同时,深入剖析了动态均衡、平滑扩容以及故障恢复与仲裁机制,为运维人员和技术决策者提供了在超融合基础架构(HCI)中部署和管理虚拟存储的实战指南。

net55的博客 588

潜流式人工湿地计算_复合人工湿地净化水产养殖污水技术

技术概论1. 定义与分类人工湿地是指用人工筑成水池或沟槽,底面铺设防渗漏隔水层,充填一定深度的基质层,种植水生植物,利用基质、植物、微生物的物理、化学、生物三重协同作用使污水得到净化的系统。当池塘养殖污水进入人工湿地时,其污染物被床体吸附、过滤、分解而达到水质净化作用。按照水体流动方式,人工湿地分为表面流人工湿地、水平潜流人工湿地、垂直潜流人工湿地以及由前面几种湿地混合搭配的组合式人工湿...

weixin_42365490的博客 4246

宏函数的缺陷

为什么会有宏函数呢? 在写代码时,直接写一些简单的语句,再用函数封装 宏函数的缺陷有哪些呢? #define _CRT_SECURE_ND_WARNINGS #include<iostream> using namespace std; //1.不加小括号会出现运算问题 //定义一个加法 #define MyAdd(x,y) x+y//((x)+(y)) void text01() { int ret = MyAdd(10, 20)*20;//预计结果600 实际410 运算状态1

qq_55303103的博客 484

DDR内存条选购避坑指南:单Rank vs 双Rank性能实测对比(附2024年颗粒推荐)

本文深入解析了内存条中单Rank与双Rank设计的原理与性能差异。通过实战测试对比,揭示了双Rank内存在高负载场景(如3D渲染、视频剪辑)中凭借Rank Interleaving技术带来的显著性能优势,并提供了2024年针对不同用户需求的DDR4/DDR5内存选购策略与避坑指南。

ik678901的博客 1124

宏函数和函数的区别及其优缺点

宏定义,编译预处理指令,在编译预处理时即进行简单的字符替换,也只进行简单的字符替换。而宏定义的函数和用户定义的函数在使用时有什么区别?如下:

Monster_ii的博客 8071

Windows窗口编程中的WM_PAINT、WM_ERASEBKGND、InvalidateRect、UpdateWindow、BeginPaint和EndPaint等函数详解

Windows窗口编程中的WM_PAINT、WM_ERASEBKGND、InvalidateRect、UpdateWindow、BeginPaint和EndPaint等函数详解

dvlinker的技术专栏 7165

openharmony之启动恢复子系统详解

需求: 添加一个名为my_service的自定义服务步骤1: 创建服务配置],],"env": [步骤2: 添加到主配置],"jobs": ["cmds": [步骤3: 验证配置# ✅ 检查配置格式 jq . /system/etc/init/my_service.cfg # 🔄 重新加载配置 begetctl reload # 📊 验证服务状态 begetctl dump_service my_serviceOpenHarmony init进程的完整生命周期。🔄 三阶段启动模型⚙️ 配置体系。

m0_67505153的博客 600

宏函数的优缺点(AI)

宏函数在编程中,特别是在C和C++等语言中,是一种预处理指令,用于在编译时将宏名称替换为对应的代码片段。宏函数具有一些显著的优点,但同时也存在一些缺点。

exotic_world的博客 553

PX4从放弃到精通(三):使用qt编译PX4

1 下载px4源码 2在Firmware所在目录下执行 mkdir Firmware-build cd Firmware-build cmake …/Firmware -G “CodeBlocks - Unix Makefiles” -DCONFIG=nuttx_px4_fmu-v5_default 第三步最后的px4_fmu-v5_default根据自己的情况修改 执行完后如图 打开QT 点击打开工程 选择源码的CmakeLists.txt文件 选择imported Kit 打开项目那一栏,构建目

超维空间科技的博客 1万+

C/C++——浅谈函数宏应用优缺点

老的C语言程序员中有一种倾向,就是把很短的执行频繁的计算写成宏,而不是定义为函数。完成I / O的g e t c h a r,做字符测试的i s d i g i t都是得到官方认可的例子。人们这样做最根本的理由就是执行效率:宏可以避免函数调用的开销。实际上,即使是在C语言刚诞生时(那时的机器非常慢,函数调用的开销也特别大),这个论据也是很脆弱的,到今天它就更无足轻重了。有了新型的机器和编译程序,函

u011832277的专栏 1867

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

小编浅谈函数宏应用优缺点

 老的C语言程序员中有一种倾向,就是把很短的执行频繁的计算写成宏,而不是定义为函数。完成I / O的g e t c h a r,做字符测试的i s d i g i t都是得到官方认可的例子。人们这样做最根本的理由就是执行效率:宏可以避免函数调用的开销。实际上,即使是在C语言刚诞生时(那时的机器非常慢,函数调用的开销也特别大),这个论据也是很脆弱的,到今天它就更无足轻重了。有了新型的机器和编

304

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

分析c语言函数的优缺点,C/C ——浅谈函数宏应用优缺点

老的C语言程序员中有一种倾向,就是把很短的执行频繁的计算写成宏,而不是定义为函数。完成I / O的g e t c h a r,做字符测试的i s d i g i t都是得到官方认可的例子。人们这样做最根本的理由就是执行效率:宏可以避免函数调用的开销。实际上,即使是在C语言刚诞生时(那时的机器非常慢,函数调用的开销也特别大),这个论据也是很脆弱的,到今天它就更无足轻重了。有了新型的机器和编译程序,函...

weixin_39883440的博客 505

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C语言中,实现函数宏的三种方式

函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。\ a = b;\ b = tmp;\ a = b;\ b = tmp;\ a = b;

qq_41854911的博客 2740

C语言中函数宏的三种封装方式详解

函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。a = b;b = tmp但上述的宏具有一个明显的缺点:当遇到ifwhile等语句且不使用花括号仅调用宏时,实际作用范围在宏的第一个分号后便结束。即a = b和b = tmp均不受控制语句所作用。因此,在工程中,一般使用三种方式来对函数宏进行封装,分别为{}和({})。下文将一一对三种方式进行分析,比较各自的优劣点。2.{}方式INT_SWAP宏使用{}{ \a = b;

嵌入式技术开发 1370

函数宏的三种封装方式

原文链接如下: https://blog.youkuaiyun.com/qq_35692077/article/details/102994959 1. 函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。 函数宏本质上为宏,可以直接进行定义,例如: #define INT_SWAP(a,b) \ int tmp = a; \ a = b; \ b = tmp 但上述的宏具有一

liming0931的专栏 1380

C 语言函数宏的几种封装方式

函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。a = b;b = tmp但上述的宏具有一个明显的缺点:当遇到 ifwhile等语句且不使用花括号仅调用宏时,实际作用范围在宏的第一个分号后便结束。即a = b和b = tmp均不受控制语句所作用。因此,在工程中,一般使用三种方式来对函数宏进行封装,分别为{}和({})。下文将一一对三种方式进行分析,比较各自的优劣点。综上,在{}和 ({})

Flin 1123

杂项:C 语言函数宏的几种封装方式

c语言函数宏

嵌入山脊的博客 6030

秀操作 | 函数宏的三种封装方式

作者:☆星轨★链接:https://blog.youkuaiyun.com/qq_35692077/article/details/1029949591. 函数宏介绍函数宏,即包含多条语句的宏定...

嵌入式Linux 387

秀操作:函数宏的三种封装方式

关注、星标公众号,直达精彩内容1. 函数宏介绍函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。函数宏本质上为宏,可...

张巧龙的博客 215

C 语言函数宏封装妙招

关注、星标公众号,直达精彩内容原文:https://blog.youkuaiyun.com/qq_35692077/article/details/1029949591. 函数宏介绍函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。函数宏本质上为宏,可以直接进行定义,例如:#defineINT_SWAP(a,b)\ inttm...

李肖遥的专栏 376

C语言函数宏怎么定义?

关注、星标公众号,直达精彩内容1. 函数宏介绍函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。函数宏本质上为宏,可以直接进行定义,例如:#defineINT_SWAP(a,b)\ inttmp=a;\ a=b;\ b=tmp但上述的宏具有一个明显的缺点:当遇...

李肖遥的专栏 814

【C 高阶】函数宏的三种封装方式

C 高阶系列导航 1. 函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。 函数宏本质上为宏,可以直接进行定义,例如: #define INT_SWAP(a,b) \ int tmp = a; \ a = b; \ b = tmp 但上述的宏具有一个明显的缺点:当遇...

Kong 2196
上一篇: 字符常量的类型
下一篇: 嵌入式软件工程师十大秘诀! [转]
linux510zcf
博客等级 码龄18年 11粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值