今天在写一个单元测试的时候出现了以下编译错误:
函数
之前用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.code
302行,在具体的定义处,确又显式地声明了访问权限为private.blog
原来是个人测试代码引用了一个第三方的头文件,第三方的头文件里用到了标准库的sstream. 当咱们单元测试代码里去#define private public时,对sstream第67行是无效的,这里__xfer_bufptrs被认为是private,而到了第302行,private被替换为public,_xfer_bufptrs被认为是public. 这就形成了编译的错误:访问权限的重定义冲突了.接口
这个事情告诉咱们,本身写的业务代码变量权限也最好要显式地声明清楚.否则你就无法在单元测试里用#define private public这种trick啦.it
没办法,为了测试业务代码里的private变量,只好修改待测试的业务代码编译
#ifdef UNIT_TEST #define MYPRIVATE public #else #define MYPRIVATE private #endif class yourclassname { //private: MYPRIVATE: int a; }
而后在单元测试代码里#define UNIT_TEST.class
或者你以为这种方式看起来很ugly的话,只能添加public接口去获取private变量了,可是当你要测试的private变量不少时,也是个很麻烦的事情.test