在我們公司中,通過網絡發送C/C++結構非常普遍。任何結構具有一個或多個uint32_t的字段:通過網絡發送結構
typedef struct {
uint32_t data1;
uint32_t data2;
} Data;
和字段(數據1,數據2,...)封裝,我們需要發送的真實數據。我們的數據大部分是單個或幾個比特長,所以爲了節省空間/帶寬,它們在特定比特位置的這些字段內對齊。
要訪問我們的真實數據,我們編寫了「干將」和「二傳手宏與bitshifting和位掩碼(struct的外面!):
#define READY_MASK 0x01 // indicates that READY is a single bit value
#define READY_OFFSET 3 // indicates position of READY inside 32-bit field
#define IS_READY(x) { ... } // returns READY value from x field
#define SET_READY(x,r) { ... } // sets READY value to x field
現在我想修改,簡化和使這個過程更安全通過添加getter和setter直接進入結構,例如:
typedef struct {
uint32_t data1;
#define READY_MASK 0x01
#define READY_OFFSET 3
inline void set_ready(uint32_t r) { /*...*/ }
inline uint32_t is_ready() { /*...*/ }
// lots of other getters and setters
} Data1;
至於我的實驗是正確的,我已經注意到,這種修改不以大小的影響結構sizeof(Data)==sizeof(Data1)
,我可以發送這個結構網絡以及另一端的接收和解碼。
我的問題是:在這個修改中有什麼不正確的嗎?有什麼危險的或我應該知道的任何事情?
那'Data1'結構不是C結構,C結構不能有成員函數。你確定你不用C++編程嗎? –
假設它是C++(因爲它只是普通的不會在C編譯...),那麼如何將函數添加到結構使事情更安全? –
當然@JoachimPileborg,Data1是C++ – crooveck