c语言的结构体或者枚举的首个成员的特殊用法问题请教?

作者站长头像
站长
· 阅读数 20

在一个项目的代码中看到,将结构体与枚举的首个成员都用做了保留项,感觉像是某种防错机制,或者是特殊考虑,从没见过这种用法,但是根据代码整体来看,代码作者水平还可以,因此这样设计一定是有特殊的考虑,不知有没有高手明白这这样设计的原因?

typedef enum
{
    ID_ErrKZM,         //捕鼠器
    
    ID_KZM1,     
    ID_KZM2,     
}ID_KZM;
static const struct
{
    INT8U       num;        
    INT8U       len;        
    INT16U      dAddr;      
    INT16U      iAddr;     
}TAB_INCD[ID_IncdNum] =
{
    {0,             0,              0xFFFF,         0xFFFF          },      //捕鼠器
    {NUM_LPo, LEN_LPo,  DE_LostPower,   IE_LPo   },      
    {NUM_Program,   LEN_Program,    DE_Program,     IE_Program      },      
};
回复
1个回答
avatar
test
2024-07-16

对于枚举,通常会用 0 值来表示一些默认的情况。比如说上下左右四个方向分别用 1~4 来表示,那数据初始并不知道是哪个方向的时候就用 0 来表示。如果定义枚举的时候四个有效方向定义在 0~3,那么在未知的情况下怎么办?对于 4 个无差别的方向,用哪个来表示默认值似乎都不好。(C 语言不记得了,好像未赋初值为随机;但是其他很多语言中基于整数的类型,包括枚举定义时不赋值为默认 0 值)

对于结构体,同样的需要一个初始值。假设我们始终使用的是指针(如果是定义实体,好像默认会按每个属性的初始值来构造),一般初始化会有两个选择:一个是 NULL,一个是指向初始的实体。在使用的时候,如果是 NULL 需要先判断,再取属性。但如果是初始的实体,那就不只需要担心 NULL 的问题。

当然在实际应用的,有时候 NULL 可能会比较好用。有时候定义一个 0xffff 作为枚举默认值也并无不可,所以并没有一个非常确定的做法,只是说题中的做法,可能相对通用性更强,也比如符合程序员们的常识。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容