C++的开源跨平台日志库glog学习研究(三)--杂项
在前面对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学习研究(三)--杂项的更多相关文章
- C++的开源跨平台日志库glog学习研究(二)--宏的使用
上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. ...
- C++的开源跨平台日志库glog学习研究(一)
作为C++领域中为数不多的好用.高效的.跨平台的日志工具,Google的开源日志库glog也算是凤毛麟角了.glog 是一个C++实现的应用级日志记录框架,提供了C++风格的流操作. 恰巧趁着五一我也 ...
- DocX开源WORD操作组件的学习系列三
DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...
- Numpy库的学习(三)
今天我们继续学习一下Numpy库的学习 废话不多说 ,开始讲 比如我们现在想创建一个0-14这样一个15位的数组 可以直接写,但是很麻烦,Numpy中就给我们了一个方便创建的方法 numpy中有一个a ...
- 谷歌日志库GLog 使用说明
1 引用头文件 加载库 #include <glog/include/logging.h> #pragma comment(lib,"libglog.lib") 2 初 ...
- Centos7 下谷歌日志库GLog配置
1 glog下载地址 https://code.google.com/archive/p/google-glog/downloads glog-0.3.3.tar.gz 需要FQ,直接打不开 2 解压 ...
- Python Pandas库的学习(三)
今天我们来继续讲解Python中的Pandas库的基本用法 那么我们如何使用pandas对数据进行排序操作呢? food.sort_values("Sodium_(mg)",inp ...
- GO的日志库log竟然这么简单!
前言 最近在尝试阅读字节开源RPC框架Kitex的源码,看到日志库klog部分,果不其然在Go原生的log库的基础上增加了自己的设计,大体包括增加了一些格式化的输出.增加一些常用的日志级别等. 一番了 ...
- DocX开源WORD操作组件的学习系列四
DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...
随机推荐
- Linux命令:ps
Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...
- Linux将程序添加到服务的方法(通用)
一:咱们通过这篇文章来演示怎么将某个程序作为服务(就类似Windows服务可以开机自动启动),这里以tomcat为例,已经亲测过: 二:步骤(最好用root用户来做这种事情,切换root用户记得su ...
- Python 字典(Dictionary) keys()方法
Python 字典(Dictionary) keys() 函数以列表返回一个字典所有的键. 语法 keys()方法语法: dict.keys() 参数 NA. 返回值 返回一个字典所有的键. 实例 以 ...
- I/O Planning
同一个BANK的电压必须是一样的,而电气特性则可以不同. 最近GTX调不出来,原来是电平不对 电源的影响 示波器看电源纹波 VCCO是为BANK的IO输出供电.比如LVCMOS33的信号,这个BANK ...
- struts2从浅至深(六)contextMap(存取数据)
A:存数据 1.利用ActionContext存数据 这种方式最简便 这是一个购物车案例 把查询来的数据放入到Session中存储起来 2.利用valuestack值栈存数据 把查询出来的数据放入到值 ...
- Codeforces801D Volatile Kite 2017-04-19 00:30 122人阅读 评论(0) 收藏
D. Volatile Kite time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- RabbitMQ 初探
有哪些优点 可靠性:RabbitMQ 提供了多种技术可以让你在性能和可靠性之间进行权衡.这些技术包括持久性.投递确认.发布者证实和高可用性. 灵活的路由:提供了多种内置交换机类型.如果你有更复杂的路由 ...
- getpass
getpass模块用于输入信息时不显示,比如输入密码时隐藏.getpass模块接收用户的输入的数据类型是str类型. #!/usr/bin/env python #-*- coding: utf-8 ...
- 避免图片路径访问405,可以用图片控件来显示局部相对路径,不需要域名就不会出现jpg静态资源访问错误
<asp:Image ID="Image1" runat="server"/> protected void Page_Load(object se ...
- php CI框架log写入
1.首先,打开application下的config.php文件,将log配置打开如下 /* |---------------------------------------------------- ...