今天在写一个单元测试的时候出现了如下编译错误: 以前用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变量很多时,也是个很麻烦的事情. 作者:sdu20112013 如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎转载,转载请注明出处.https://www.cnblogs.com/sdu20112013/p/11803295.html