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

相关推荐
isyangli_blog10 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb20081110 小时前
FastAPI APIRouter
开发语言·python
Benszen10 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆10 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木11 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充11 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~11 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
basketball61611 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
春生野草12 小时前
反射、Tomcat执行
java·开发语言
雪的季节12 小时前
企业级 Qt 全功能项目
开发语言·数据库·qt