打印

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

[复制链接]
1216|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huifly520|  楼主 | 2009-5-6 09:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现有有一要求:
  结构体前面成员决定后面成员的有无,即结构体长度是可伸缩的
比如  typedef struct a
{    
    UINT8 b;
    UINT8 c;        
    UINT8 d;
    UINT8 e;
    UINT16 f;
    UINT8 g;                    
};
这里成员变量 b中bit 3 决定成员变量d 的有无, 我不可能写成
 typedef struct a
{    
    UINT8 b;
    UINT8 c;
         #if (b&0x08 == 0x08)        
    UINT8 d;
         #endif
    UINT8 e;
    UINT16 f;
    UINT8 g;                    
};
有啥的好法子?

相关帖子

沙发
highend| | 2009-5-6 09:59 | 只看该作者

当然不行。 独立变量处理

UINT8 d;

代码中,可能用到d的地方,
if (b&0x08 == 0x08)   
    ddddddddddd


使用特权

评论回复
板凳
goosen| | 2009-5-6 11:58 | 只看该作者

re

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

使用特权

评论回复
地板
未来是梦| | 2009-5-6 21:49 | 只看该作者

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

如果是要实现结构长度可变,可以使用零长度数组


struct A
{    
    UINT8 c;   
    UINT8 e;
    UINT16 f;
    UINT8 g;    
    UINT8 d[0];            //结构最后一个成员设为零长度数组
};
UINT8 b;
struct A * test_p;

if (b&0x08 == 0x08) 
   test_p=malloc(sizeof(struct A) + 1);          //1可以改为任意
else
   test_p=malloc(sizeof(struct A)) ;



 





使用特权

评论回复
5
McuPlayer| | 2009-5-6 21:56 | 只看该作者

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

使用特权

评论回复
6
ecomputer| | 2009-5-8 13:13 | 只看该作者

肯定不可以的

因为编译器在处理你的代码时就要决定结构体的大小了。2楼,4楼都可以

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

12

帖子

0

粉丝