在前面对glog分别做了两次学习,请看C++的开源跨平台日志库glog学习研究(一)C++的开源跨平台日志库glog学习研究(二)--宏的使用,这篇再做个扫尾工作,算是基本完成了。

  • 编译期断言

动态断言在调试过程中是一个很重要的手段,而且我们使用的也比较多。相应的,静态断言,也即是编译期断言随着模板编程、元编程的发展,也表现出了动态断言所没有的优势:在编译期完成断言检查,而不是等到运行时!

比如在glog的源码中,有如下代码(logging.h line 908):

 template <bool>
struct CompileAssert {
}; #define GOOGLE_GLOG_COMPILE_ASSERT(expr, msg) \
typedef google::glog_internal_namespace_::CompileAssert<(bool(expr))> msg[bool(expr) ? : -]

先给出一个简单的测试用例:

 GOOGLE_GLOG_COMPILE_ASSERT(, must_be_true1);       //ok
GOOGLE_GLOG_COMPILE_ASSERT(->,must_be_true2); //error

上面这两句测试代码中第二句是通不过的,在Windows下visual studio报错:

error C2118: negative subscript

在linux下报错:

错误:数组‘must_be_true’的大小为负

这个错误很明显,也即在GOOGLE_GLOG_COMPILE_ASSERT宏中,如果第一个参数expr为true,那么根据第二个参数msg就可以创建一个含一个CompileAssert对象的数组:

google::glog_internal_namespace_::CompileAssert<>  msg[];

否则,一旦第一个参数expr为false,那么就是:

google::glog_internal_namespace_::CompileAssert<>  msg[-];

好吧,因为数组大小在C++中是不能为负的!这样就保证了宏能够在编译期完成检查。

编译期检查、编译器断言是很有用的一个功能,尤其是在C++的模板编程、元编程中,其作用不可小觑。当然,也有一定的缺点,比如对于动态变化的值,却无法使用编译期断言而只能使用动态断言:

 void test(int i)
{
assert(i>); //ok
GOOGLE_GLOG_COMPILE_ASSERT(i>, must_be_true); //error
}

在Windows下和linux下分别报错如下:

VisualStudio: error C2975: 'unnamed-parameter' : invalid template argument for 'google::glog_internal_namespace_::CompileAssert', expected compile-time constant expression

GCC:错误:‘i’不能出现在常量表达式中
  • 名字重整解析

在glog的源码文件目录中,有两个文件:demangle.h和demangle.cc。这两个文件只实现了一个对外接口:

bool Demangle(const char *mangled, char *out, int out_size);

且在整个项目中并没有使用,但其实是很有用的一个功能,为什么这么说?因为这是用于实现解析C++中名字重整后的函数原型。比如对于一个经过编译器名字重整后为_Z1fi的函数,经过解析后得到其原型是f(int),同理,详细请看我之前写的一篇文章:C++中的名字重整技术

  • 字符串的模糊匹配

在vlog_is_on.cc的line 69行有一个SafeFNMatch_的函数实现,该函数可以用来实现简单的字符串模糊匹配功能,这里就不再多说了,请参考我之前写的一篇文章:C++实现的字符串模糊匹配

  • 代码规范

一个小小的glog库,从代码上也能看出Google的代码规范,比如头文件引用一般次序是C库、C++库、其他库的.h、项目内的.h等,请看Google完整的C++代码规范:Google的C++编码规范中文版。这里就不再介绍了。

最新文章

  1. Dancing Links and Exact Cover
  2. DNS解析过程和域名收敛、域名发散、SPDY应用
  3. python logging模块笔记
  4. java 线程的让步
  5. 虚拟机centos6.5 --VirtualBox设置全屏
  6. Linux时间相关函数
  7. nginx的一些配置
  8. Linux中SVN的备份与恢复
  9. mvc 根据模板导出excel,直接导出文件流
  10. English trip EM2-LP-4B At school Teacher:Will
  11. docker 中ulimit设置理解
  12. 前端路由简介以及vue-router实现原理
  13. HTML页面跳转的5种方式
  14. 白盒静态自动化测试工具:PMD使用指南
  15. 美图吴欣鸿:请不要叫我CEO
  16. ROS 命令学习记录
  17. javaservlet处理四种常用api请求get,put,post,delete
  18. 【转】【Linux】sed命令详解
  19. UVALive 6044(双连通分量的应用)
  20. 2018 Wannafly summer camp Day8--连通块计数

热门文章

  1. Part 3 - Advanced Concepts(11-13)
  2. php读取用友u8客户档案
  3. OpenNI体感应用开发实战 (Kinect相机)
  4. 计算服务器的pv量算法
  5. (KMP 水)Wow! Such Doge! -- hdu -- 4847
  6. hdu 4888 最大流慢板
  7. hdu 2780 Su-Su-Sudoku(DFS数独)
  8. 阉割版BBBlack安装Debian
  9. Code Review Checklist and Guidelines for C# Developers
  10. 全自动baidu云盘下载脚本