今天在写一个单元测试的时候出现了如下编译错误:

以前用gtest为了测试业务代码里的private函数和变量,一直是在单元测试代码通过#define private public这样的trick达到测试业务代码的private变量的目的.怎么现在就不行了呢?

现在用的gcc版本是8.3 以前用的gcc4.8肯定是没问题的.

刚看到这个编译告警我是很懵逼的,我没有使用sstream这个头文件啊,而且这个redclared是什么鬼,我没有定义过这个struct __xfer_bufptrs啊,怎么会有重定义的问题呢.

根据编译错误告警sstream:redclared with diffrent access,我们打开标准库的sstream看一下.



在第67行,声明了__xfer_bufptrs,但是并没有显式的声明访问权限,那默认的就是private.



302行,在具体的定义处,确又显式地声明了访问权限为private.

原来是我的测试代码引用了一个第三方的头文件,第三方的头文件里用到了标准库的sstream. 当我们单元测试代码里去#define private public时,对sstream第67行是无效的,这里__xfer_bufptrs被认为是private,而到了第302行,private被替换为public,_xfer_bufptrs被认为是public. 这就造成了编译的错误:访问权限的重定义冲突了.

这个事情告诉我们,自己写的业务代码变量权限也最好要显式地声明清楚.不然你就没法在单元测试里用#define private public这种trick啦.

没办法,为了测试业务代码里的private变量,只好修改待测试的业务代码

#ifdef UNIT_TEST
#define MYPRIVATE public
#else
#define MYPRIVATE private
#endif class yourclassname
{
//private:
MYPRIVATE:
int a;
}

然后在单元测试代码里#define UNIT_TEST.

或者你觉得这种方式看起来很ugly的话,只能添加public接口去获取private变量了,但是当你要测试的private变量很多时,也是个很麻烦的事情.

最新文章

  1. Java 查漏补缺
  2. Activiti 学习笔记记录
  3. MVC5-8 ViewData、ViewBag、TempData分析
  4. css2----实现三角形和带角框
  5. python 数据结构-集合set
  6. node io.sockt 聊天应用
  7. ###学习《C++ Primer》- 2
  8. hyper-v使用wifi链接网络
  9. Oracle数据库常用关键字以及函数
  10. rpm包
  11. 在C#中GUID生成的四种格式
  12. python(leetcode)-66加一问题
  13. jQuery数字滚动(模拟网站人气、访问量递增)原创
  14. PAT A1148 Werewolf - Simple Version (20 分)——暴力遍历,负负得正
  15. linux arm-linux-gcc 安装编译
  16. DB2 OLAP函数的使用
  17. kernel内核配置说明
  18. 【caffe】用训练好的imagenet模型分类图像
  19. 修改windows命令行字体
  20. Django学习总结②----关系运算与F,Q关系

热门文章

  1. 你应该知道的简单易用的CSS技巧
  2. 文件操作——RandomAccessFile
  3. Java文件操作——File
  4. asp.net core刷新css缓存
  5. 自学导航页(待续ing)
  6. ini 文件操作指南
  7. Color Length UVALive - 5841
  8. Python基础库之jieba库的使用(第三方中文词汇函数库)
  9. CH3803扑克牌
  10. Python_MySQL数据库的写入与读取