google-glog 开源库分析(四):glog宏技巧
在核心结构之外,google-glog还通过宏技巧提供统一简洁的使用接口。
同时,通过命名空间的使用尽可能的减少名字冲突,提供一个简介的日志库。
宏助手
- 通过宏提供一个统一的简洁的日志输出接口
- 简单的使用如LOG(INFO),LOG(ERROR)等日志输出接口
- 通过宏提供丰富的日志输出扩展功能
- 提供了IF,CHECK等助手宏来简化代码
编程技巧
- 命名空间的使用
- 因为是作为库使用,所以glog中使用了命名空间类避免名字冲突
- 通过google命名空间提供glog库的接口空间,内部实现则进一步封装到嵌套命名空间中
- 宏技巧:分流
- 通过DEBUG宏可将日志输出定位到LogMessage中还是什么也不输出的NullStream中
- 宏技巧:隐藏
- 日志输出核心是通过LogMessage等类实现,同时通过宏提供了丰富的接口如条件日志,CHECK日志等
- 宏技巧:清洁
- 在使用宏过程中,会在使用完成后进行#undef操作来保证库的宏不会干扰到使用库的程序
- 宏技巧:断言
- 在mutex.h中,通过定义#define MutexLock(x) ...来保证同步锁不会出现MutexLock *lock=new MutexLock(&mu)之类错误
- 宏技巧:技巧
- 1.在#if条件中使用# error,there is ... 直接输出错误消息的宏可在编译期间就给出错误提示
- 2.在宏定义中使用do{...}while(0)来保证宏内容作为一个整体,避免出现宏展开时的问题:
- 如#define call() a();b(),在调用if(1<0) call()时扩展成if(1<0) a(); b()后b()总是会被调用
小结
以上只是我参考了网上资料及阅读源代码时的总结,还没在实际项目中应用。
通过阅读源代码,也是一种享受。