C++产品中常用的3个开源项目
By 青衣极客 Blue Geek In 2020-08-23
C++大概是一种会让很多程序员都头疼的编程语言,其复杂的语法和笨拙的内存管理机制让产品很容易出现各种意想不到的BUG。现在还在用C++开发产品大概只有两种原因:(1) 只会C++,(2) 计算性能要求高。无论是第一种原因,还是第二种原因,都让你不得不直接面对C++,那么有没有什么巨人的肩膀可以踮踮脚呢?这里不得不提起谷歌推出的三个经典开源项目:gflags、glog和gtest。
1. GFlags
从命令行传入一些参数来控制程序运行的流程和效果是一个比较普遍的需求,开源社区也有很多的解决方案,这里推荐使用GFlags。这个开源库可以让你在你的产品中很容易地加入命令行参数定义:
DEFINE_int32(arg, val, "introduct");
这样,你就定义了一个名为 “FLAGS_arg” 的 int 全局变量用于接受命令行传入的 “arg” 参数,并且设置了默认值为 “val”。
随便编写一个普通的main函数没有办法完成从命令行到FLAGS_arg的参数传递,我们需要在main函数中调用命令行参数解析的接口:
int main(int argc, char ** argv) {
gflags::ParseCommandLineFlags(&argc, &argv, true);
std::cout << FLAGS_arg << std::endl;
return 0;
}
GFlags的使用是不是非常简单!如果你在自己的产品中遇到较多的参数配置,并且不胜其烦,那么不妨试试GFlags。
Github: https://github.com/gflags/gflags

2. Glog
一个成熟的软件产品无论如何都无法缺少日志系统,而一个不成熟的软件就更需日志了,因为随时产生的“不符合预期”情况都需要找到原因,并进行修正。很难想象在一个庞大复杂的软件工程中,没有记录运行状况的日志。有些对debug模式情有独钟的朋友可能认为日志是多此一举,但实际的开发经验表明了,在软件产品中,使用日志的分析效率远高于debug模式。因此,不到万不得已,绝不使用debug。
开源社区中提供的日志项目也很多,有些朋友或许还有自己使用文件操作打印日志的习惯,这里推荐一款谷歌的开源日志项目Glog。日志系统并不像大家通常想象得那样只是把字符串写入文件那么简单,因为程序运行的情况有时会非常复杂,比如多线程运行;有时会对日志系统的性能有要求,还会有对日志类型和格式的要求等等。使用一款经过验证的成熟日志系统,能够避免很多不必要的踩坑经历,而且也有更多的网上资源可供查询。
日志系统往往需要在程序启动的时候进行初始化,glog的初始化可以参照如下例子实现:
#include "glog/logging.h"
int main(int argc, char ** argv) {
google::InitGoogleLogging(argv[0]);
return 0;
}
glog提供了如下级别的日志:INFO、WARNING、ERROR、以及FATAL,其中FATAL级别的日志一旦打印,程序就会终止。开发者可以使用以下的宏来进行日志的打印:
LOG(INFO) << "hello";
如果你需要打印一些仅仅在debug模式下生效的日志,可以使用 DLOG 宏。如果你还有很多自定义的级别,那么可以使用 VLOG 宏,不过需要记住, VLOG 的数值越低级别越高。
关于Glog更多的个性化配置可以参照官方的手册,不过有一些问题手册是不会告诉你的,比如:
(1) 每一行日志最多只能打印30000个字符
(2) 日志文件的名字非常不灵活,每次运行都产生一个新的日志文件
如果你对以上这两个问题强烈不满,那么可能需要稍加修改一下glog的源代码。
Github: https://github.com/google/glog

3. GTest
测试常常被一些经验尚浅的开发者所轻视,却不知这是能够保证稳定性、避免低级错误的最有效的方法。无论是大公司还是小公司,日常的开发都是很慌忙的,代码也常常是在头晕脑胀的情况下写出来的。这种现实环境之下,如果缺少对应的测试,轻则浪费很多时间用于调试bug,重则造成软件产品出现严重不稳定的错误。谷歌开源的GTest项目就是业内常用的一款开源的C++单元测试项目。
使用GTest首先需要包含对应的头文件 “gtest/gtest.h”。如果你已经编写了一个函数 func(),那么可以创建如下单元测试:
TEST(MyFuncs, FuncRet) {
EXPECT_TRUE(func() == 0);
}
以上例子用于进行单个函数的功能测试,如果某个函数有多个边界条件,可以使用 TEST 宏定义多个单元测试。
如果你需要测试一个类,并且还需要在测试之间预备一些环境,那么就需要稍微复杂一点。首先,编写一个类,并继承 testing::Test;然后是按需要实现一些成员,比如 SetUpTestCase 和 TearDownTestCase 用于在这个类的所有测试之前和之后运行,常用于加载环境和释放资源,比如 SetUp 和 TearDown 用于在这个类的每一个单元测试之前和之后运行。
日常使用GTest组织单元测试并不需要知道那些复杂的用法,先用起来,排除软件中存在的隐患,至于那些神乎其技的东西可能这辈子都用不上,就不需要费心思去关心了。
Github: https://github.com/google/googletest

以上这三个开源项目都是经过很多大公司的产品线验证过的,在自己的项目或者产品中使用这些开源代码也就放心得多。万一遇上搞不定的情况,可以在网上搜索到海量的解决方案;如果现有情况无法满足需要,还可以在这些开源项目的基础上进行开发。

COMMENT
博客评论区功能由Github Issue提供,提交Issue时请以本文标题为话题。
"BG114-C++产品中常用的3个开源项目"