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

news2024/12/29 9:58:31

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

在c语言开发中,除了使用函数封装代码之外,也经常使用宏来封装一些重要或简洁的代码。

宏在c开发有三种:预定义宏,不带参宏,和带参数宏,通常,带参数宏也叫函数宏,函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销,在实际项目开发中,函数宏的作用很强大,下面介绍三种常用的三种封装方式:

第一种:{} 方式

比如:

此时如果在非控制语句中调用,则可以正常编译通过,如下:

但当在控制语句中调用时,比如分支语句if(else if、else 等)如:

编译器会报错,如下:

上面的语句展开为:

SWAP(x, y); 后面的 ; 使得 if 的作用域终结了,后续的 else 当然没有找到与之匹配的 if 了。宏函数应该适用于任何语法。

这种函数宏的优缺点:

优点:简单粗暴。

缺点:不能在无花括号且有分支的 if 语句中直接调用;能够不带 ; 直接调用。

第二种   do{...}while(0) 方式

do{...}while(0) 为控制流语句,是一条复合语句,在语句块中可以添加参数检测。例如:

编译器会把 do{...}while(0); 认为为一条语句。因此,do{...}while(0) 方式的函数宏可以在无花括号且有分支的 if 语句中直接调用。例如:

这种函数宏的优缺点:

优点:支持在无花括号且有分支的 if 语句中直接调用;支持提前退出函数宏;强制调用时必须使用 ;。

缺点:无返回值,不能作为表达式的右值使用。

第三种 ({}) 方式

({}) 为 GNU C 扩展的语法,非 C 语言的原生语法,封装后形态如下:

({}) 既可以用于分支语句中,也可以作为右值,例如:

这种函数宏的优缺点:

优点:支持在无花括号且有分支的 if 语句中直接调用;有返回值,支持作为表达式的右值。

缺点:不支持提前退出函数宏;非 C 的原生语法,编译器可能不支持。

总结

综上,在 {}、do{...}while(0) 和 ({}) 这三种函数宏的封装方式之中,应尽可能不使用 {},考虑兼容性一般选择使用 do{...}while(0),当需要函数宏返回时可以考虑使用 ({}) 或直接定义函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1161724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HR应用人才测评来提升人才价值

对于企业而言,产出价值是最重要的,但企业拥有人才,才能产出更多的价值,做HR这么久发现很多企业,都欠缺人才管理的测评技术,导致很多人才被埋没或者浪费,这也说明一个很大的问题,一定…

Github 自动化部署到GitHub Pages

1.准备工作 新建仓库 新建项目 配置 vite.config.ts base: ./,部署应用包时的基本URL,例:vue-cli 5.x 配置 publicPath 推送到远程仓库 2.配置 GitHub Token 点击 Settings -> Actions -> General 找到 Workflow permissions,选中第…

sqlserver涉及到三种排序后生成的数字

with temp as (select 1 标识,2023-01-01 日期,a 项目union all select 1,2023-01-01,a union all select 2,2023-01-01,a union all select 2,2023-01-01,b union all select 3,2023-01-01,a union all select 3,2023-01-01,b union all select 3,2023-01-01,c union all …

耳朵小戴什么耳机合适,2023年适合小耳道的蓝牙无线耳机分享

你们是否曾为了追求音乐的同时,担心自己的听力健康呢?尤其是耳朵小的群体,佩戴入耳式时间一长,就会感觉耳道存在一定的疼痛感,不过别担心,现在有了一种完美的解决方案——骨传导耳机!这种炫酷的…

解决Windows Server 2012 由于没有远程桌面授权服务器可以提供需求可证

刚开始提示 之后就登录不了 (如下图提示) 由于windows server 2012 R2 安装了 远程桌面角色,但是这个角色是120天免费的,需要购买授权的。解决方法是取消/删除这个角色,就可以恢复正常的远程 一直下一步 远程桌面服…

2023年阿里云双11活动云服务器可选实例规格、配置及活动价格分享

阿里云服务器2023年双11活动价格是多少?轻量应用服务器2核2G3M带宽轻量服务器87元1年、2核4G4M带宽165元1年;云服务器经济型e实例2核2G3M配置99元1年;计算型c7实例2核4G1M配置864.79元1年;通用型g7实例2核8G1M配置1089.91元1年&am…

Linux C语言进阶-D9字符指针与字符串

初始化字符指针:把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针中。 char str[] "Hello World"; char *p str; 在C编程中,当一个字符指针指向一个字符串常量时,不能修改指针指向的对象的值 char * p &…

【PC】第26赛季第2轮更新公告

正式服维护日期 ※ 下列时间可能会根据维护情况而发生变化。 11月8日上午8:00 – 下午4:30 地图轮换 ※ 地图轮换将于北京时间每周三上午10点进行。 ※ 在随机选择地图的区域中,各地图将按大型地图25%、小型地图12.5%的概率随机匹配。 测试服 普通比赛&#xf…

Capybara库如何批量下载新浪图片

按照要求写一个使用Capybara库的下载程序。该程序使用Ruby下载新浪新闻的图片,并使用爬虫IP服务器duoip的8000端口进行下载。 require capybara require mechanize# 创建一个爬虫IP服务器实例 proxy Mechanize.new爬虫IP主机: duoip,爬虫IP端口: 8000# 访问新浪新闻…

黑马最新「SpringBoot3+Vue3」全套教程上线,练手很香

转眼2023年仅剩2个月,大家的“卷”也进入了白热化阶段,毕竟10月随份子的钱还没还完,双11又付了一大笔尾款,还要准备回家过年的钱……为了更卷(赚更多钱),又又又有程序员来找播妞要新教程了。 “…

全球地表动态水体产品(数据集V2.0)(2000-2020年/8天/250米)

摘要 全球地表动态水体产品(8天/250米)GSWED(Global Surface Water Extent Dataset)由中国科学院空天信息创新研究院湿地与环境遥感研究团队制作而成。本套数据集是基于MODIS数据构建了一套全球地表水体NDVI阈值时空参数集,在此基础上使用遥感大数据云平台进行研发的,使用G…

全优学堂功能说明

1. 快速使用系统 系统首页 #2. 功能列表 使用端功能模块PC端微信生态微信生态接入配置课程班级管理课程配置,支持多种收费方式、多校区配置班级所有学员班级课表上课记录学生学生信息、综合信息查询:报读课程、订单、课表、上课记录、变动日志家长绑定…

小程序 - 起步

小程序代码的构成-项目结构 了解项目的基本组成结构 ①用来存放所有小程序的页面 ②utils 用来存放工具性质的模块(例如:格式化时间的自定义模块) ③app.js 小程序项目的入口文件 ④app.json 小程序项目的全局配置文件 ⑤app.wxss 小程序项…

苹果手机如何导出微信聊天记录?3个方法,教你快速导出!

微信聊天记录不仅只是几句话、几张图片、几个视频,更是我们与好友之间的感情见证。所以说,把微信上的一些重要聊天记录导出或者备份是很有必要的事情。 如果出现误删或者手机损坏、丢失等情况,那么这些珍贵的聊天记录就会消失。如何导出微信…

tolua中table.remove怎么删除表中符合条件的数据

tolua中table.remove怎么删除表中符合条件的数据 介绍问题(错误方式删除数据)正确删除方案从后向前删除递归方式删除插入新表方式 拓展一下总结 介绍 在lua中删除表中符合条件的数据其实很简单,但是有一个顺序问题,因为lua的表中…

【蓝桥杯】2023省赛H题

考察知识点:双向链表,小根堆 完整代码在文章末尾 题目 【问题描述】 给定一个长度为 N 的整数数列: A1,A2,...,AN。你要重复以下操作 K 次 :…

Day 5 登录页及路由 (三) 基于axios的API调用

系列文章目录 本系列记录一下通过Abp搭建后端,VueElement UI Plus搭建前端,实现一个小型项目的过程。 Day 1 Vue 页面框架Day 2 Abp框架下,MySQL数据迁移时,添加表和字段注释Day 3 登录页以及路由 (一)Day 4 登录页以…

三菱MC协议及报文格式详解

一、简介 三菱MC协议是指三菱电机公司(Mitsubishi Electric)使用的一种通信协议,用于在三菱PLC(可编程逻辑控制器)和其他设备之间进行数据交换和通信。 三菱MC协议有多个版本,最常见的是MC-Protocol&…

uniapp原生插件之安卓USB扫码枪扫码插件

插件介绍 安卓USB扫码枪扫码,监听USB扫码枪 插件地址 安卓USB扫码枪扫码插件 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 插件方法 开启监听:setListener 重要说明:当开启监听后当前窗体不可点击,点击无任何…

最新夸克网盘 迅雷网盘 UC网盘cpa拉新推广教程 推广申请渠道

最近很多朋友都想做夸克网盘、迅雷网盘、uc网盘的推广 但是找不到申请渠道 可以通过”聚量推客“进行申请,一手渠道价格高 数据好 接下来,让我们开始夸克网盘、迅雷网盘、UC网盘的开通操作教程: 目前市面上,这三家网盘统一的地…