请教在C语言中,使用函数和使用宏各自的优点和缺点~~~

2019-12-27 18:45发布

额,这个问题困扰我很长一段时间了...

  1. #define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList )                                                                               
  2. {                                                                                                                                                                                       
  3. List_t * const pxConstList = ( pxList );                                                                                                       
  4.         /* Increment the index to the next item and return the item, ensuring */                               
  5.         /* we don't return the marker used at the end of the list.  */                                                       
  6.         ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;                                                       
  7.         if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) )       
  8.         {                                                                                                                                                                               
  9.                 ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;                                               
  10.         }                                                                                                                                                                               
  11.         ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner;                                                                                       
  12. }
复制代码

这是FreeRTOS的一段源码,小弟如果自己实现这段功能,我肯定(不加思索)使用函数.但既然源码使用宏(源码这样用,应该是有它的道理),小弟不明白,恳请指教...

问题1: 使用宏相比较函数有哪些优点和缺点?

问题2: (抛开个人习惯问题)在什么情况下应当使用函数,什么情况下应当使用宏?

个人理解使用函数的优点:
1> 会对参数类型进行检查,容易避免基本的语法错误...
2> 可能(至少对于我这种)会提高代码的可读性...

个人理解使用宏的优点:
1> 使用宏,实际上是代码替换,最直观的好处就是减少函数调用(不会额外增加堆栈深度)...
2> 宏的替换是在编译期间进行的,不会增加程序运行期间的负担...
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
wang1216
1楼-- · 2019-12-29 11:46
 精彩回答 2  元偷偷看……
takashiki
2楼-- · 2019-12-29 14:30
wang1216 发表于 2017-7-3 13:30
宏的好处多了,比如不用输入长的参数名

红的好处比坏处大多了,要是有不同的实现方法,比如枚举、内联函数等等时,尽量不要使用宏。
在调试时,很显然宏是不友好的,而内联函数则可以进行调试。
遇到有重名的时候,宏就是一个灾难。要是程序代码多了,死都不知道怎么死的。
lianglee
3楼-- · 2019-12-29 18:24
我的习惯是:

简单用宏,复杂用函数,
就近用宏(上下文),远用函数(各模块)。

IO操作,和MCU相关的配置之类,用宏,方便移槙。
graycker
4楼-- · 2019-12-29 21:05
以前只知道用宏会快些,不需要单独编译后再链接调用,上个月在客户那边调程序,stm8s下1M主频,调用其他文件的控制灯函数 将近60ms的延时,把函数放到文件内,即时响应,和不用函数一样。
bad_fpga
5楼-- · 2019-12-30 01:09
graycker 发表于 2017-7-3 14:55
以前只知道用宏会快些,不需要单独编译后再链接调用,上个月在客户那边调程序,stm8s下1M主频,调用其他文 ...

你是说改成宏后,响应快多了?
graycker
6楼-- · 2019-12-30 03:12
 精彩回答 2  元偷偷看……

一周热门 更多>