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