2017-08-01 58 views
0

我得到了我的C這樣的事情++頭文件說明需要這個C++類

#define CLASS_DECLARATION_S_BIT(Type, FuncName, BitCount) \ 
protected:  \ 
    Type m_k##FuncName : BitCount; \ 
public:   \ 
    Type const FuncName()const{return m_k##FuncName;} \ 
    void FuncName(Type const& Value){m_k##FuncName = Value;} 

typedef struct tagTest 
{ 
public: 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test1, 10);//10 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test2, 7);//17 
    unsigned __int64 Test3:4; 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test4, 8);//29 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test5, 4);//33 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test6, 8);//41 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test7, 4);//45 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test8, 8);//53 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test9, 4);//57 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test10, 1);//58 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test11, 1);//59 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test12, 1);//60 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test13, 1);//61 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test14, 1);//62 
    CLASS_DECLARATION_S_BIT(unsigned __int64, Test15, 2);//64 

    __int64 Field_1()const{return *(((__int64 const*)(this))+0);} 
    void Field_1(__int64 const &kValue){*(((__int64*)(this))+0) = kValue;} 
}TestInfo; 

我就到現在這是什麼底部兩行Field_1做題? 有人可以請解釋給我,謝謝

+0

最後兩行看起來像'offsetof()'宏人的變化。 – PaulMcKenzie

+0

@PaulMcKenzie我認爲這只是一種方式來訪問所有字段打包在一個int64_t(通過akward reinterpret_casting) – Frank

回答

3

在我眼中,這看起來像一個非常尷尬的做bitpacking的方式。

Field_1()所做的是提供一種方法來訪問各個字段的所有值(經過精心設計,以適應64位,因此評論)打包到一個int64_t中。

代碼濫用了這樣一個事實,即打包字段的內存佈局允許它只是將存儲在該位置的數據重新解釋到內存中,而不必通過組合各個字段來手動創建值。

它實際上是功能上等同於這個(如果我讀它的權利):

struct tagTest { 
    union { 
    struct { 
     in64_t Test1 : 10; 
     in64_t Test2 : 7; 
     ... 
    }; 
    int64_t Field_1; 
    }; 
};