我经常在代码中看到结构,在结构的末尾有一个内存储备。
struct STAT_10K4
{
int32_t npos; // position number
...
float Plts;
Pxts;
float Plto [NUM];
uint32_t reserv [(NUM * 3)% 2 + 1];
};
这通常是为了支持可变长度记录。可以使用以下几种方法:
1如果知道最大记录数,则所有情况都可以使用简单的结构定义。
2在许多协议中,都有一个“标头数据”习惯用法。标头为固定大小,但为数据变量。数据将作为“ blob”接收。因此,可以通过指向blob的指针来声明和访问标头的结构,然后从该数据开始进行数据处理。例如:
typedef struct
{
uint32_t messageId;
uint32_t dataType;
uint32_t dataLenBytes;
uint8_t data[MAX_PAYLOAD];
}
tsMessageFormat;
数据是在Blob中接收的,因此是void* ptr, size_t len
。
然后强制转换缓冲区指针,以便可以按以下方式读取消息:
tsMessageFormat* pMessage = (psMessageFormat*) ptr;
for (int i = 0; i < pMessage->dataLenBytes; i++)
{
//do something with pMessage->data[i];
}
在某些语言中,“数据”可以指定为空记录,但是C ++不允许这样做。有时您会看到省略了“数据”,并且您必须执行指针算术才能访问数据。
替代方法是使用构建器模式和/或流。
Windows经常使用这种模式。许多结构都有一个cbSize
字段,该字段允许将其他数据传递到该结构之外。该结构可适应大多数情况,但是具有cbSize允许在必要时提供其他数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句