初始化结构的联合

时间:2016-04-28 20:00:45

标签: c++ c

struct EXMPL
{
  union
  {
    struct
    {
      struct 
      {
        uint8_t AA;
        uint8_t BB;
        uint8_t CC;
        uint8_t DD;
      }Rev;

      struct
      {
        uint8_t XX;
        uint8_t VV;
        uint8_t WW;
        uint8_t FF;
      }IDs;
    };

    struct UNN
    {
      uint32_t A;
      uint32_t B; 
    };
  };
};

当我尝试这样初始化时:

EXMPL aStruct = {{ 0x00, 0x00, 0x01, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }};

我得到了太多的初始化值"错误。非常感谢任何帮助,谢谢。

4 个答案:

答案 0 :(得分:2)

C中,EXMPL aStruct = {{...必须为struct EXMPL aStruct = {{...

{{缺少2个级别 - 添加了

int main(void) {
  struct EXMPL  // level 1
  {
    union  // level 2
    {
      struct // level 3
      {
        struct  // level 4
        {
          uint8_t AA;
          uint8_t BB;
          uint8_t CC;
          uint8_t DD;
        }Rev;

        struct
        {
          uint8_t XX;
          uint8_t VV;
          uint8_t WW;
          uint8_t FF;
        }IDs;
      } ;

      // level 3 
      // but irrelevant to initialization as only 1st union member counts by default
      struct UNN  
      {
        uint32_t A;
        uint32_t B;
      } ;
    };
  };

  struct EXMPL aStruct = {{{{ 0x00, 0x00, 0x01, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }}}};
  ...

答案 1 :(得分:1)

当然,你得到的初始化程序错误太多了。您使用的初始化程序太多了。工会在任何时候都只拥有其中一名成员。不是两个,不是三个,不是九个。

你也应该选择一种语言。从长远来看,C和C ++并不相同。工会在大多数C ++程序中几乎没有地位。直到最近,关于他们能够持有什么的规则发生了变化,他们几乎没用了,但是在你真正想要或需要工会的情况下,情况仍然很少。

答案 2 :(得分:1)

您不能直接将外部结构设置为其中一个联合成员。 您应该在 EXMPL 中设置联合的一个成员。

作为参考,请遵循这个简单的例子。

说我有这个结构定义:

    struct unionExample {
      union{    
        int integerInUnion;
        long longInUnion;
      }
    }

如果要将union成员设置为int,则必须将其设置为:

struct unionExample union_example;        
union_example.integerInUnion = 5;

只是为了纠正你的错误,你试图像这样设置联盟成员:

union_example = 5

当然你不能这样做,因为union_example的类型是unionExample而不是int。

回到您发布的示例,您需要在联合中命名第一个结构。我将命名为 XYZ 。所以代码看起来像这样:

 struct EXMPL
{
  union
  {
    struct XYZ
    {
      struct 
      {
        uint8_t AA;
        uint8_t BB;
        uint8_t CC;
        uint8_t DD;
      }Rev;

      struct
      {
        uint8_t XX;
        uint8_t VV;
        uint8_t WW;
        uint8_t FF;
      }IDs;
    };

    struct UNN
    {
      uint32_t A;
      uint32_t B; 
    };
  };
};

您现在应该像这样设置 XYZ 的值:

EXMPL aStruct;
aStruct.XYZ = {{ 0x00, 0x00, 0x01, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }};

答案 3 :(得分:1)

有人可以评论指定初始值设定项的可移植性吗?在我看来,这比许多嵌套括号更清晰。

y

更不用说这允许在需要时直接初始化A和B.