利用宏扩展代码的可读性

上周看了一下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工作量,这跟简化代码基本是一个意思,呵呵.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值