为啥不能#define private public了?
今天在写一个单元测试的时候出现了如下编译错误:

以前用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变量很多时,也是个很麻烦的事情.
为啥不能#define private public了?的更多相关文章
- Ruby中类的进阶(继承,private, public, protect)
类中的public,protect,private public method class Point def test end end 这样定义的test方法就是一个public方法可以在类内外使用 ...
- C++ private,public,protected 关键字
第一: private,public,protected的访问范围: private: 只能由该类中的函数.其友元函数访问,不能被任何其他访问,该类的对象也不能访问. protected: 可以被 ...
- C++作用域限定符:private/public与protected
C++的作用域限定符其实涉及到了C++特性中的封装和继承. public/private:涉及类的封装特性.对于一个类需要对外展示的部分,我们可以将其声明为public,对于不希望对外展示的,我们将其 ...
- 【C++基础】 类中static private public protected
静态成员在一个类的所有实例间共享数据 “类属性”,是描述类的所有对象共同特征的一个数据项,对所有对象,它的值相同,static定义,为整个类所共有.相对于“实例属性” 如果static成员是私有类型, ...
- protected private public 的区别
1.public,protected,private是Java里用来定义成员的访问权限的,另外还有一种是"default",也就是在成员前不加任何权限修饰符.如: publi ...
- 第四十篇-private,public,protected的区别
1.public: public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private: private表示私有,私有的意思就是除了class自己之外,任何人都不可 ...
- [Java]private, public,protected,friendly的区别(转载)一下子就记住了
http://teddyboy200382.blog.163.com/blog/static/320112002008825112549780/ 说明这四个关键字之前,我想就 class 之间的关系做 ...
- Getting Private/Public IP address of EC2 instance using AWS-cli [closed]
For private IP address: aws ec2 describe-instances --instance-ids i-b78a096f | grep PrivateIpAddress ...
- private,public,protected 的作用
public 修饰的变量和函数可以在类的内部和外部都可以访问 protected 修饰的变量和函数只可以在类的内部访问,如果该类派生出子类,那么在子类中该变量和函数也可以使用 private ...
随机推荐
- Nginx+PHP7.3.9 Docker镜像制作
最近因项目需要制作了多个版本的php docker镜像,制作过程可谓是一波三折,因基于yum的方式安装php的方式在安装扩展插件时很不方便,不容易找到插件对应的yum源,所以PHP在docker镜像中 ...
- 使用sp_getAppLock引发的一个小问题
这几天线上频繁报如下的错误:“无法释放应用程序锁(数据库主体: 'public',资源: 'aa'),原因是当前没有保留该应用程序锁.” 下面是写法: declare @result int; BEG ...
- Java为什么需要四种引用?
首先抛出一个问题:在闲暇时间收拾自己家里的时候,对某一件物件要不要丢弃的问题上,是否有过食之无味,弃之可惜的感觉? 同样的,JVM在回收Java对象的时候,是否对对象实例也有食之无味,弃之可惜的感受? ...
- php微信支付v3版本签名生成
前几天需要对接微信支付卡包营销活动需要对接微信新版SDKv3版 签名生成规则,微信的官方文档里面说明的还算可以吧,不过个人觉得不太理想- -. 自己调试的时候调试了半天才找了错误原因. https: ...
- java工具类之Arrays、Collections以及比较器
一.Comparable和Comparator的详解 Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实 ...
- 单元测试实践(SpringCloud+Junit5+Mockito+DataMocker)
网上看过一句话,单元测试就像早睡早起,每个人都说好,但是很少有人做到.从这么多年的项目经历亲身证明,是真的. 这次借着项目内实施单元测试的机会,记录实施的过程和一些总结经验. 项目情况 首先是背景,项 ...
- 算法学习之剑指offer(七)
题目1 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P% ...
- Beautiful Soup 4.2.0 文档(一)
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时 ...
- MYSQL事件隔离级别以及复读,幻读,脏读的理解
一.mysql事件隔离级别 1未提交读(READUNCOMMITTED) 另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)( 隔离级别最低,并发性能高 ) 2 ...
- 线程封闭之栈封闭和ThreadLocal
线程封闭 在多线程的环境中,我们经常使用锁来保证线程的安全,但是对于每个线程都要用的资源使用锁的话那么程序执行的效率就会受到影响,这个时候可以把这些资源变成线程封闭的形式. 1.栈封闭 所谓的栈封闭其 ...