爲啥不能#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.code


302行,在具體的定義處,確又顯式地聲明瞭訪問權限爲private.blog

原來是個人測試代碼引用了一個第三方的頭文件,第三方的頭文件裏用到了標準庫的sstream. 當咱們單元測試代碼裏去#define private public時,對sstream第67行是無效的,這裏__xfer_bufptrs被認爲是private,而到了第302行,private被替換爲public,_xfer_bufptrs被認爲是public. 這就形成了編譯的錯誤:訪問權限的重定義衝突了.接口

這個事情告訴咱們,本身寫的業務代碼變量權限也最好要顯式地聲明清楚.否則你就無法在單元測試裏用#define private public這種trick啦.it

沒辦法,爲了測試業務代碼裏的private變量,只好修改待測試的業務代碼編譯

#ifdef UNIT_TEST
#define MYPRIVATE public
#else
#define MYPRIVATE private
#endif

class yourclassname
{
//private:
MYPRIVATE:
    int a;
}

而後在單元測試代碼裏#define UNIT_TEST.class

或者你以爲這種方式看起來很ugly的話,只能添加public接口去獲取private變量了,可是當你要測試的private變量不少時,也是個很麻煩的事情.test

相關文章
相關標籤/搜索