zoukankan      html  css  js  c++  java
  • 为啥不能#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变量很多时,也是个很麻烦的事情.

  • 相关阅读:
    JavaScript向input标签的value赋值
    thinkphp关于本地引用图片
    jquery中得到input的值
    HTML的video标签,不能下载视频代码
    PHP数据库类
    MySQL数据库之MyISAM与InnoDB的区别
    php函数ob_start(),解决header输出头报错问题
    eps图片中文乱码问题
    感悟----程序员需要养成的习惯
    <前m大的数>的妙解
  • 原文地址:https://www.cnblogs.com/sdu20112013/p/11803295.html
Copyright © 2011-2022 走看看