c(++)union数据结构

时间:2010-11-30 12:21:53

标签: c++ c data-structures struct unions

我正在为μC编程,我有以下数据结构:

typedef struct
{
  RF12Head head;

  typedef union 
  {
    uint8_t raw[40];

    typedef struct
    {
      node_id nodeId;
      uint8_t hierachyDepth;
    } MessageNodeFound;
  } data;

} RF12Message;

RF12Message包含标题和数据部分。 现在我想要有不同的消息格式。

我希望能够做到这样的事情:

RF12Message msg;

memset(&msg.data.raw, 0xEF, sizeof(msg.data.raw)); // fill in directly

//or indirectly:

msg.data.MessageNodeFound.nodeId = 3;
msg.data.MessageNodeFound.hierachyDepth = 2;

但是编译器会抛出一个错误:“无效使用'RF12Message :: data'”,为什么?

谢谢你!

3 个答案:

答案 0 :(得分:3)

问题在于您的typedef声明。 RF12Message ::数据 union的40 uint8_tMessageNodeFound;它是由这些东西组成的数据类型。

类似的问题会影响您对MessageNodeFound的声明。删除typedef,我认为它应该有用。

答案 1 :(得分:3)

您的代码中有太多typedef个。 试试这个:

http://codepad.org/frysgQte

答案 2 :(得分:0)

对于C ++

typedef声明只声明一个类型。对于这个问题,没有名为'MessageNodeFound'或'data'的数据成员。

这应该给你一个想法

typedef struct 
{ 

   typedef union  
   { 
      char raw[40]; 

      typedef struct 
      { 
         int nodeId; 
         char hierachyDepth; 
      } MessageNodeFound;

      MessageNodeFound m;

   } Data; 
   Data d;
} RF12Message;

int main(){
   RF12Message msg; 

   memset(&msg.d.raw, 0xEF, sizeof(msg.d.raw)); // fill in directly 

   //or indirectly: 

   msg.d.m.nodeId = 3; 
   msg.d.m.hierachyDepth = 2;
}