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

以前用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了?的更多相关文章

  1. Ruby中类的进阶(继承,private, public, protect)

    类中的public,protect,private public method class Point def test end end 这样定义的test方法就是一个public方法可以在类内外使用 ...

  2. C++ private,public,protected 关键字

    第一: private,public,protected的访问范围:   private: 只能由该类中的函数.其友元函数访问,不能被任何其他访问,该类的对象也不能访问. protected: 可以被 ...

  3. C++作用域限定符:private/public与protected

    C++的作用域限定符其实涉及到了C++特性中的封装和继承. public/private:涉及类的封装特性.对于一个类需要对外展示的部分,我们可以将其声明为public,对于不希望对外展示的,我们将其 ...

  4. 【C++基础】 类中static private public protected

    静态成员在一个类的所有实例间共享数据 “类属性”,是描述类的所有对象共同特征的一个数据项,对所有对象,它的值相同,static定义,为整个类所共有.相对于“实例属性” 如果static成员是私有类型, ...

  5. protected private public 的区别

    1.public,protected,private是Java里用来定义成员的访问权限的,另外还有一种是"default",也就是在成员前不加任何权限修饰符.如:    publi ...

  6. 第四十篇-private,public,protected的区别

    1.public: public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private: private表示私有,私有的意思就是除了class自己之外,任何人都不可 ...

  7. [Java]private, public,protected,friendly的区别(转载)一下子就记住了

    http://teddyboy200382.blog.163.com/blog/static/320112002008825112549780/ 说明这四个关键字之前,我想就 class 之间的关系做 ...

  8. 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 ...

  9. private,public,protected 的作用

    public  修饰的变量和函数可以在类的内部和外部都可以访问 protected   修饰的变量和函数只可以在类的内部访问,如果该类派生出子类,那么在子类中该变量和函数也可以使用 private   ...

随机推荐

  1. springboot 使用i18n进行国际化乱码解决

    方式1.设置国际化的编码和你使用的编译器(IDEA之类)一致,如编译器为UTF-8则在application配置文件中添加 #i18n spring: messages: encoding: UTF- ...

  2. .Net Core 商城微服务项目系列(一):使用IdentityServer4构建基础登录验证

    这里第一次搭建,所以IdentityServer端比较简单,后期再进行完善. 1.新建API项目MI.Service.Identity,NuGet引用IdentityServer4,添加类InMemo ...

  3. Python Excel操作——xlrd、xlwd

    读取 1.导入模块 import xlrd 2.打开Excel文件读取数据 data = xlrd.open_workbook('excel.xls') 3.获取一个工作表 1 table = dat ...

  4. Mac 安装node npm cnpm vue 以及卸载 node 和 npm 的方法 清空npm缓存的方法

    S01 安装node(内含npm) 首先,到官网下载长期支持版,截止目前,最新的长期支持版本号是10.16.3 https://nodejs.org/zh-cn/download/ 下载完毕后,安装该 ...

  5. git checkout 提示 “error: The following untracked working tree files would be overwritten by checkout” 解决

    问题描述 Windows 或者 macOS 操作系统中,文件名是不区分大小写的.对于已经提交到仓库中的文件修改文件名的大小写,然后又用 git rm 命令将老文件从 Git 仓库删除掉,并保存下新的文 ...

  6. JSON说明

    1. JSON 数据的书写格式 对象:是一个无序的“‘名称/值’对”集合.一个对象以“{”(左括号)开始,“}”(右括号)结束.每个“名称”后跟一个“:”(冒号):“‘名称/值’ 对”之间使用“,”( ...

  7. 利用shell脚本个性化运行jar任务

    利用shell脚本可以个性化运行jar任务,废话不多说,直接上代码: #!/bin/bash APP_PATH=/root/bigdata/jars/data_migration_from_sqlse ...

  8. 重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源

    作者: OAM 项目负责人 导读:2019 年 10 月 17 日,阿里巴巴合伙人.阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 Qcon 上海重磅宣布,阿里云与微软联合推出开放应用模型 Op ...

  9. GLSL 参考GIMP源码实现色彩平衡调节

    色彩平衡 修图工具中的色彩平衡一般用来根据亮度等级调整图片中颜色的偏色,调整偏色涉及到加色原理和减色原理 其实我们通过三原色加色原理的图片就可以知道,红色的对比色是青色,蓝色的对比色是黄色,绿色的对比 ...

  10. 你也可以写个服务器 - C# Socket学习2

    前言 这里说的服务器是Web服务器,是类似IIS.Tomcat之类的,用来响应浏览器请求的服务. Socket模拟浏览器的Url Get请求 首先浏览器的请求是HTTP协议.我们上一篇说过,HTTP是 ...