现在的位置: 首页 > 综合 > 正文

利用宏扩展代码的可读性

2018年05月19日 ⁄ 综合 ⁄ 共 696字 ⁄ 字号 评论关闭

上周看了一下ffmpeg,在ffmpeg.c->main()->avcodec_register_all()中看到这样一些代码:

REGISTER_DECODER (AASC, aasc);
REGISTER_DECODER (AMV, amv);
REGISTER_ENCDEC (ASV1, asv1);
REGISTER_ENCDEC (ASV2, asv2);
REGISTER_DECODER (AVS, avs);

很显然是在注册各种codec的结构体,一是把各codec相关的信息挂载到全局链表中,二要通过宏定义来判断哪些codec需要注册,哪些不需要.

REGISTER_DECODER的宏是这样定义的:

#define REGISTER_DECODER(X,x) {
extern AVCodec x##_decoder;
if(CONFIG_##X##_DECODER)  avcodec_register(&x##_decoder); }

对REGISTER_DECODER (AASC, aasc);来说,展开来就是这样:

extern AVCodec aasc_decoder;

if(CONFIG_AASC_DECODER)

avcodec_register(&aasc_decoder);

原理很简单,但是用的却很巧妙,主要是##这个宏用的人并不是很多,在这里倒是个很恰当的适用场景.

我觉得这种用法的好处有好几个:

  • 简化代码,使主要逻辑一目了然,这时最大的优点.我们现在的项目里就有很多这样的函数,宏掺杂在代码中,怎么排版都觉得很乱,一眼看上去根本不知道这些代码的目的是什么.
  • 减少coding工作量,这跟简化代码基本是一个意思,呵呵.

抱歉!评论已关闭.