2017-08-01 57 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; 
    }; 
};