cpp常用库gflags/glog/gtest
gflags处理命令行参数
简介
如果项目通过CMake构建,只需要在CMakeLists.txt中加入类似以下配置即可:
简要用法
gflags
头文件
定义命令行参数
比如:
其中,DEFINE_string
只是其中一种数据类型,支持的全部数据类型有:
gflags定义类型 | 描述 |
---|---|
DEFINE_bool | 布尔类型 |
DEFINE_int32 | 32位整型 |
DEFINE_int64 | 64位整型 |
DEFINE_uint64 | 无符号64位整型 |
DEFINE_double | 浮点类型 |
DEFINE_string | C++ string类型 |
在main()
函数加入如下代码,解析命令行参数:
一般都将上述代码放到main()
函数的开始位置。
代码内访问传入的参数
使用FLAGS_<变量名>
就可以在代码中访问解析得到的参数值。例如:
使用
其它变量类型类似,但布尔类型的参数有些独特性。比如定义一个布尔类型的参数debug_bool
,在命令行中可以进行如下指定:
进阶
跨文件调用
访问在另一个文件中定义的gflags变量
:使用DECLARE_
,作用类似于extern
声明变量。
为了方便管理变量,推荐在*.cpp/*.cc
文件中DEFINE_
变量,在对应的*.h
文件或单元测试中DECLARE_
变量。比如:
参数检查
gflags使用配置文件传入参数
配置文件内容类似于:
使用时,直接通过--flagfile
指定该配置文件my.flags即可:
glog轻量级日志
简介
安装glog之前需要安装gflags,这样glog就可以使用gflags去解析命令行参数。如果项目通过CMake构建,只需要在CMakeLists.txt中加入类似以下配置即可:
简要用法
glog
头文件
初始化
main()
函数加入以下代码,初始化glog
:
使用
进阶
日志级别
LOG(<level>)
默认4个级别,<level>
可选项:INFO/WARNING/ERROR/FATAL
。- 条件日志:
LOG_IF/LOG_EVERY_N/LOG_IF_EVERY_N/LOG_FIRST_N
。 - 自定义级别宏
VLOG(n)
。自定义日志级别,通过参数--v=<val>
指定输出的日志级别。比如:--v=3
则只输出n<=3
的日志。同样,自定义级别宏VLOG
也支持VLOG_IF/VLOG_EVERY_N/VLOG_IF_EVERY_N
等。 - 在
LOG
宏名前加D
,指定只在Debug模式(即没有开启NDEBUG
)下生效,比如DLOG/DLOG_IF/DLOG_EVERY_N
等。
常用命令行参数
glog
依赖于gflags
,以下为glog
常见的命令行参数。
命令行参数 | 描述 |
---|---|
--logtostderr | 默认false。将所有日志信息都输出到stderr上 |
--log_dir | 日志输出目录,默认为/tmp/。当--logtostderr 设置为false时,则日志输出到文件 |
--minloglevel | 超过该级别的日志才会记录 |
--stderrthreshold | 超过该级别的日志除了输出到日志外,还会输出到stderr |
--v | VLOG(<level>) 的最大输出日志级别 |
--vmodule | 分模块/文件名指定VLOG(<level>) 的最大输出日志级别,以字符串<module1>=<level1>,<module2>=<level2>... 形式指定,支持通配符,优先级高于--v |
CHECK
宏检查错误
当CHECK()
的条件不满足时,glog
会记录FATAL
级别日志,并输出调用堆栈。
和C++自带的断言assert()
不同,无论是否开启NDEBUG
,CHECK()
都会执行。除了CHECK()
,glog
还提供其它的宏,包括:
CHECK_XXX | 条件 |
---|---|
CHECK_EQ(x,y) | x==y |
CHECK_NE(x,y) | x!=y |
CHECK_LE(x,y) | x<=y |
CHECK_LT(x,y) | x<y |
CHECK_GE(x,y) | x>=y |
CHECK_GT(x,y) | x>y |
在判断指针是否为空时,需要将NULL
转换为相应的类型再进行比较,比如:
在判断char *
类型的字符串时,可以使用CHECK_STREQ()/CHECK_STRNE()
,相对应带有CASE的版本CHECK_STRCASEEQ()/CHECK_STRCASENE()
为大小写不敏感的。传递NULL值给这些宏是安全的。
可以使用CHECK_DOUBLE_EQ()
检查两个浮点数是否相等,并允许出现比较小的误差。如果需要自己提供的误差范围,可以使用CHECK_NEAR()
,该宏的第三个参数就是指定的误差范围。
其它
- 当需要线程安全时,使用
RAW_LOG/RAW_CHECK
等; - 系统级日志记录
SYSLOG/SYSLOG_IF/SYSLOG_EVERY_N
宏,将调用syslog()函数来记录系统级别的日志; - perror风格日志
PLOG/PLOG_IF
-
精简日志信息,删除日志级别、所在代码行数等信息:
glog How To Use Google Logging Library (glog) 使用 Google 的 glog 日志库 Google C++库
gtest断言
ASSERT_*
系列的断言,当检查点失败时,退出执行。EXPECT_*
系列的断言,当检查点失败时,继续向下执行。- 还有
testing::StaticAssertTypeEq<int, T>();
可以用来检查类型T是不是int类型,否则产生一个编译时的静态断言错误。