为啥不能#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 ...
随机推荐
- Java基础学习笔记(三) - 抽象类和接口
一.抽象类 没有方法主体的方法称为抽象方法,包含抽象方法的类就是抽象类. Java中使用 abstract 关键字修饰方法和类,抽象方法只有一个方法名,没有方法体. public abstract c ...
- [Redis] Redis的基本数据结构
key-value 通过key获取或设置value SET key value GET key SET server:name "fido" GET server:name SET ...
- SpringCache - 请求级别缓存的简易实现
前言 在SpringCache缓存初探中我们研究了如何利用spring cache已有的几种实现快速地满足我们对于缓存的需求.这一次我们有了新的更个性化的需求,想在一个请求的生命周期里实现缓存. 需求 ...
- MySQL-时区导致的时间前后端不一致
背景 今天早上刚上班,就被同事提示,程序的日期处理有问题.数据库里日期为:2019-05-21 11:00:00 而前端显示的日期为:2019-05-21 16:00:00 分析 那肯定是和时区相关了 ...
- 网页布局——Flex弹性框布局
布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. 需要安卓4.4及以上版本可以使用 ...
- 自学web前端达到什么水平,才能满足求职的标准?
大多数野生程序员最棘手的问题就是如何依靠技术解决温饱,通俗来讲就是技术折现的问题. 如果是单纯出于兴趣,或者只是为了突击某一阶段或者某一项目技术壁垒,不跟就业挂钩的自学倒也是无关痛痒.但是当上岗成为自 ...
- Ubuntu 重装vmtool
1. 虚拟机菜单 -> 更新虚拟机 : 2. 弹出的窗口中: 3. 拷贝红色的文件到可读写的目录: 4. 解压,运行解压出来的绿色脚本文件,一路回车:
- 深入了解一下HTTP缓存机制
HTTP 缓存机制作为 web 性能优化的重要手段,是Web 开发知识体系库中的一个基础环节,但是对于很多学习者来说,仅仅只是知道浏览器会对请求的静态文件进行缓存,但是为什么被缓存,缓存是怎样生效的, ...
- 一个基于C++11的单例模板类
#ifndef _SINGLETON_H_#define _SINGLETON_H_ template<typename T>class Singleton : public Uncopy ...
- POJ 1035 Spell checker(串)
题目网址:http://poj.org/problem?id=1035 思路: 看到题目第一反应是用LCS ——最长公共子序列 来求解.因为给的字典比较多,最多有1w个,而LCS的算法时间复杂度是O( ...