Fork me on GitHub

记一次巧妙的宏定义的使用方式

最近有个需求,需要将原来的一个界面扩展出新的样式,供活动使用。

于是翻看工程里原有的代码,发现有些类里都有这样的宏定义调用

1
@section(@"3", NSStringFromClass([WVRADViewSection class]))

起初看着有点不解,宏定义不都是直接调用的么,为啥要在前面加个@?

赶紧点进去看看,是这么一个宏定义:

1
2
3
4
5
#define section(_sectionID_, _className_) \
compatibility_alias _WVRViewModelDispatcher WVRViewModelDispatcher; \
+ (void)load { \
[WVRViewModelDispatcher registerSection:_sectionID_ className:_className_]; \
}

就是load方法的宏定义,方便通过映射来做类型匹配,不需要在管理类里导入太多头文件。

但是我还是比较纠结 compatibility_alias 的用途。网上有解释说这个是苹果留的关键字,用来重构时方便改变类名,但是我查找 _WVRViewModelDispatcher,并没有地方引用,这就很奇怪,为什么要在这里放一行没有用到的代码。

经过一番思考,我突然想起来问题的根源:这个宏定义使用的时候需要在前面加一个@,这么使用肯定要有理由的,我们看到这个宏定义使用了平时很常见的section作为名称,这本身就不合理,但是由于compatibility_alias的存在,使用时就必须在前面加上@,编译器才认为这是在调用一个宏定义,而不是一个变量或者方法。

想到这里,我立即去工程里试了一下,这样果然有效的可以让编译器区分开宏定义和变量。

不得不说,这么使用确实很巧妙,但是也很让人懵逼。

经历此事,我再次深深的感到,项目中写好文档的重要性!!!

------------- 本文结束感谢您的阅读 -------------