在前面对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++编码规范中文版。这里就不再介绍了。

C++的开源跨平台日志库glog学习研究(三)--杂项的更多相关文章

  1. C++的开源跨平台日志库glog学习研究(二)--宏的使用

    上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. ...

  2. C++的开源跨平台日志库glog学习研究(一)

    作为C++领域中为数不多的好用.高效的.跨平台的日志工具,Google的开源日志库glog也算是凤毛麟角了.glog 是一个C++实现的应用级日志记录框架,提供了C++风格的流操作. 恰巧趁着五一我也 ...

  3. DocX开源WORD操作组件的学习系列三

    DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...

  4. Numpy库的学习(三)

    今天我们继续学习一下Numpy库的学习 废话不多说 ,开始讲 比如我们现在想创建一个0-14这样一个15位的数组 可以直接写,但是很麻烦,Numpy中就给我们了一个方便创建的方法 numpy中有一个a ...

  5. 谷歌日志库GLog 使用说明

    1 引用头文件 加载库 #include <glog/include/logging.h> #pragma comment(lib,"libglog.lib") 2 初 ...

  6. Centos7 下谷歌日志库GLog配置

    1 glog下载地址 https://code.google.com/archive/p/google-glog/downloads glog-0.3.3.tar.gz 需要FQ,直接打不开 2 解压 ...

  7. Python Pandas库的学习(三)

    今天我们来继续讲解Python中的Pandas库的基本用法 那么我们如何使用pandas对数据进行排序操作呢? food.sort_values("Sodium_(mg)",inp ...

  8. GO的日志库log竟然这么简单!

    前言 最近在尝试阅读字节开源RPC框架Kitex的源码,看到日志库klog部分,果不其然在Go原生的log库的基础上增加了自己的设计,大体包括增加了一些格式化的输出.增加一些常用的日志级别等. 一番了 ...

  9. DocX开源WORD操作组件的学习系列四

    DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...

随机推荐

  1. Docker 技巧:删除 Docker 容器和镜像

    默认安装完 docker 后,每次执行 docker 都需要运行 sudo 命令,非常浪费时间影响效率.如果不跟 sudo,直接执行 docker images 命令会有如下问题: Get http: ...

  2. origin里用c语言编程

    学习自白东升老师的origin8.0课程. 其实是originC语言.origin中大多绘图和处理功能都是originC语言完成的,可以同时按下ctrl和shift然后点击相应的功能,就会出现每个按钮 ...

  3. hB

    function Coef = LowPassHb(Fs,Fpass,Apass,n) % -- Fs sample frequency % -- Fpass % -- Apass(dB) % -- ...

  4. Redis Quick Start [遇到问题解决问题版]

    http://redis.io/topics/quickstart make test 时的问题: 问题:gcc: Command not found 解决:yum install gcc [root ...

  5. (最长回文串 模板) 最长回文 -- hdu -- 3068

    http://acm.hdu.edu.cn/showproblem.php?pid=3068 最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory ...

  6. Oracle EBS标准错误信息如何追踪 (Debug)

    http://www.cnblogs.com/songdavid/articles/2067534.html 调用EBS标准API的时候,可能会返回一些让人看不懂的错误,比如最近我在开发rcv_tra ...

  7. 在TFS中使用Git Tags(标签或标记),实现代码的版本管理

    一.概述: 与TFVC中标记(Label)一样,Git的标签(Tag)也是TFS系统的代码管理中非常重要的一个版本管理工具.使用标签,我们可以每个时间点的代码注上一个通俗.并且容易记忆的名称(例如标签 ...

  8. QuartzNet3.0实现作业调度

    Quartz是一个完全由JAVA编写的开源作业调度框架. Quartz.NET是Quartz的.NET移植,它用C#写成,可用于.Net以及.Net Core的应用中. 目前最新的quartz.net ...

  9. Cookie操作-----Selenium快速入门(十一)

    什么是cookie?顾名思义,就是饼干,小甜饼.而根据读音则是“曲奇”的意思,相信不少的人都吃过.而在网络上,cookie是指浏览器在本地的一种少量数据的存储方式.例如,我们常见的,登陆的时候有个ch ...

  10. leetcode 搜索插入位置

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输 ...