在我们公司中,通过网络发送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