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

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),当需要函数宏返回时可以考虑使用 ({}) 或直接定义函数。

相关推荐
阿正的梦工坊2 小时前
JavaScript 微任务与宏任务完全指南
开发语言·javascript·ecmascript
CPUOS20103 小时前
嵌入式C语言高级编程之MVC设计模式
c语言·设计模式·mvc
jolimark3 小时前
C语言存在的问题及Zig语言如何改进,差异对比全在这
c语言·内存管理·系统编程·类型系统·zig语言
知行合一。。。3 小时前
Python--05--面向对象(属性,方法)
android·开发语言·python
青梅橘子皮3 小时前
C语言---指针的应用以及一些面试题
c语言·开发语言·算法
浅时光_c3 小时前
3 shell脚本编程
linux·开发语言·bash
Evand J4 小时前
【三维轨迹目标定位,CKF+RTS,MATLAB程序】基于CKF与RTS平滑的三维非线性目标跟踪(距离+方位角+俯仰角)
开发语言·matlab·目标跟踪
今天又在写代码5 小时前
java-v2
java·开发语言
competes5 小时前
慈善基金投资底层逻辑应用 顶层代码低代码配置平台开发结构方式数据存储模块
java·开发语言·数据库·windows·sql
Ulyanov6 小时前
用Pyglet打造AI数字猎人:从零开始的Python游戏开发与强化学习实践
开发语言·人工智能·python