huifly520 发表于 2009-5-6 09:39

请教一个结构体方面的问题

现有有一要求:<br />&nbsp;&nbsp;结构体前面成员决定后面成员的有无,即结构体长度是可伸缩的<br />比如&nbsp;&nbsp;typedef&nbsp;struct&nbsp;a<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;b;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;c;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;d;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT16&nbsp;f;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;g;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />};<br />这里成员变量&nbsp;b中bit&nbsp;3&nbsp;决定成员变量d&nbsp;的有无,&nbsp;我不可能写成<br />&nbsp;typedef&nbsp;struct&nbsp;a<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;b;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#if&nbsp;(b&0x08&nbsp;==&nbsp;0x08)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;d;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT16&nbsp;f;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;g;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />};<br />有啥的好法子?

highend 发表于 2009-5-6 09:59

当然不行。 独立变量处理

UINT8&nbsp;d;<br /><br />代码中,可能用到d的地方,<br />if&nbsp;(b&0x08&nbsp;==&nbsp;0x08)&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ddddddddddd<br /><br /><br />

goosen 发表于 2009-5-6 11:58

re

把可变成员用指针指向,动态分配(根据有决定作用的成员)

未来是梦 发表于 2009-5-6 21:49

结构成员的有无,编译时就定下了。不过

如果是要实现结构长度可变,可以使用零长度数组<br /><br /><br />struct&nbsp;A<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;c;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT16&nbsp;f;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;g;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;d;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//结构最后一个成员设为零长度数组<br />};<br />UINT8&nbsp;b;<br />struct&nbsp;A&nbsp;*&nbsp;test_p;<br /><br />if&nbsp;(b&0x08&nbsp;==&nbsp;0x08)&nbsp;<br />&nbsp;&nbsp;&nbsp;test_p=malloc(sizeof(struct&nbsp;A)&nbsp;+&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1可以改为任意<br />else<br />&nbsp;&nbsp;&nbsp;test_p=malloc(sizeof(struct&nbsp;A))&nbsp;;<br /><br /><br /><br />&nbsp;<br /><br /><br /><br /><br /><br />

McuPlayer 发表于 2009-5-6 21:56

先明确“预编译”是什么意思

ecomputer 发表于 2009-5-8 13:13

肯定不可以的

因为编译器在处理你的代码时就要决定结构体的大小了。2楼,4楼都可以
页: [1]
查看完整版本: 请教一个结构体方面的问题