帮助中心 广告联系

成都百姓网-人才网,招聘网,二手房网,房产网,租房网,教育网,新闻网,信息网,信息港-成都在线

热门关键词:

C语言函数宏怎样实现封装呢?

来源:原创/投稿/转载 发布时间:2023-09-23

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

  但上述的宏具有一个明显的缺点:当遇到if、while等语句且不使用花括号仅调用宏时,实际作用范围在宏的第一个分号后便结束。即a = b和b = tmp均不受控制语句所作用。

  因此,在工程中,一般使用三种方式来对函数宏进行封装,分别为{}、do{...}while(0)和({})。下文将一一对三种方式进行分析,比较各自的优劣点。

  这是因为INT_SWAP(var_a, var_b);最后的;已经把if的作用域终结了,后续的else当然没有找到与之匹配的if了。

  因此,解决方法有两种,分别为不使用;(port.1)或规定必须使用带花括号的if(port.2),例如:

  可见,不使用;的调用方式无论从程序阅读还是使用方法方面都是十分别扭的;而规定必须使用带花括号的if的调用方式有违常理的,因为宏函数应该适用于任何语法。

  do{...}while(0)表示只执行一遍{}内的语句,表象来说与{}的功能是一致的。不同的是,do{...}while(0)可以提前退出函数宏、整合为一条语句与强制调用时必须使用;。

  由于do{...}while(0)实际为 while 循环,因此可以使用关键字break提前结束循环。利用该特性,可以为函数宏添加。例如:

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

  C 语言规定,do{...}while(0)语法必须使用;作为语句结尾。因此不可能存在以下语句的程序出现:

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

  与do{...}while(0)相同,({})支持在无花括号且有分支的if语句中直接调用。例如:

  与do{...}while(0)不同的是,({})不能提前退出函数宏与支持返回值。({})毕竟不是 while 循环,不能直接使用break退出函数宏是比较容易理解。那支持返回值是什么意思呢?

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

本网转载作品的目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。如涉及作品内容、版权等问题,请联系我们进行修改或删除!