引用一段IjkPlayer的代码作示例:
#define IJK_REGISTER_PROTOCOL(x) \
{ \
extern URLProtocol ijkimp_ff_##x##_protocol; \
int ijkav_register_##x##_protocol(URLProtocol *protocol, int protocol_size);\
ijkav_register_##x##_protocol(&ijkimp_ff_##x##_protocol, sizeof(URLProtocol)); \
}
在上面代码中,IJK_REGISTER_PROTOCOL为宏名称,x为变量,##为连接符,用于连接前后字符串。
当我们有很多个名称类似的函数,比如
ijkimp_ff_async_protocol
,
ijkimp_ff_ijklongurl_protocol
,
ijkimp_ff_ijktcphook_protocol
,
ijkimp_ff_ijkhttphook_protocol
,
这几个函数,只有中间部分是不同的,所以我们可以借助宏定义的方式来定义一个公共的名称,避免为async
,ijklongurl
,ijktcphook
,ijkhttphook
相关函数都实现一个上层方法。使代码更加简洁和利于理解。
于是,我们的调用就变成了这样:
IJK_REGISTER_PROTOCOL(async);
IJK_REGISTER_PROTOCOL(ijklongurl);
IJK_REGISTER_PROTOCOL(ijktcphook);
IJK_REGISTER_PROTOCOL(ijkhttphook);
IJK_REGISTER_PROTOCOL(ijksegment);