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变量很多时,也是个很麻烦的事情.

  • 相关阅读:
    Django model 字段类型及选项解析(二)
    MYSQL数据库设计规范与原则
    爬虫相关模块命令回顾
    Django model 字段类型及选项解析(一)
    Django自身安全机制-XSS和CSRF
    分页
    css样式大全
    HTML标签和属性大全
    IsPost 判断
    HTML中夹杂CODE
  • 原文地址:https://www.cnblogs.com/sdu20112013/p/11803295.html
Copyright © 2011-2022 走看看