Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化结构的并集_C++_C - Fatal编程技术网

C++ 初始化结构的并集

C++ 初始化结构的并集,c++,c,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

当我尝试这样初始化时:

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; 
    };
  };
};

我得到一个“初始化值太多”错误。非常感谢您的帮助,谢谢

当然你会遇到太多的初始化错误。您使用的初始值设定项太多。一个工会在任何时候只拥有一个会员。不是两个,不是三个,不是九个


你也应该选择一种语言。C和C++是不一样的远景。在大多数C++程序中,工会几乎没有什么地位。直到最近,当关于他们可以持有什么的规则发生变化时,他们几乎没有用处,但仍然有少数情况下你真的想要或需要一个联盟。

当然,你会遇到太多的初始值设定者。您使用的初始值设定项太多。一个工会在任何时候只拥有一个会员。不是两个,不是三个,不是九个


你也应该选择一种语言。C和C++是不一样的远景。在大多数C++程序中,工会几乎没有什么地位。直到最近,关于它们所能容纳的内容的规则发生了变化,它们才几乎没有用处,但仍然有少数情况下您真正想要或需要一个联合。

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

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

假设我有这个结构定义:

EXMPL aStruct = {{ 0x00, 0x00, 0x01, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }};
如果要将union成员设置为int,则必须如下所示:

    struct unionExample {
      union{    
        int integerInUnion;
        long longInUnion;
      }
    }
struct unionExample union_example;        
union_example.integerInUnion = 5;
union_example = 5
为了纠正您的错误,您正在尝试如下设置工会成员:

    struct unionExample {
      union{    
        int integerInUnion;
        long longInUnion;
      }
    }
struct unionExample union_example;        
union_example.integerInUnion = 5;
union_example = 5
当然你不能这么做,因为union_示例的类型是unionExample而不是int

回到您发布的示例,您需要命名联合体中的第一个结构。我将把它命名为XYZ。因此,代码将如下所示:

    struct unionExample {
      union{    
        int integerInUnion;
        long longInUnion;
      }
    }
struct unionExample union_example;        
union_example.integerInUnion = 5;
union_example = 5
现在,您应设置XYZ的值,如下所示:


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

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

假设我有这个结构定义:

EXMPL aStruct = {{ 0x00, 0x00, 0x01, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }};
如果要将union成员设置为int,则必须如下所示:

    struct unionExample {
      union{    
        int integerInUnion;
        long longInUnion;
      }
    }
struct unionExample union_example;        
union_example.integerInUnion = 5;
union_example = 5
为了纠正您的错误,您正在尝试如下设置工会成员:

    struct unionExample {
      union{    
        int integerInUnion;
        long longInUnion;
      }
    }
struct unionExample union_example;        
union_example.integerInUnion = 5;
union_example = 5
当然你不能这么做,因为union_示例的类型是unionExample而不是int

回到您发布的示例,您需要命名联合体中的第一个结构。我将把它命名为XYZ。因此,代码将如下所示:

    struct unionExample {
      union{    
        int integerInUnion;
        long longInUnion;
      }
    }
struct unionExample union_example;        
union_example.integerInUnion = 5;
union_example = 5
现在,您应设置XYZ的值,如下所示:


C
中,
EXMPL-aStruct={{…
需要是
struct-EXMPL-aStruct={…

2级
{
缺失-添加

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

C
中,
EXMPL-aStruct={{…
需要是
struct-EXMPL-aStruct={…

2级
{
缺失-添加

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

有人能评论一下指定初始值设定项的可移植性吗?在我看来,这比嵌套的括号要清楚得多

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 }}}};
  ...

更不用说,如果需要的话,这允许直接初始化A和B。

有人能评论一下指定初始化器的可移植性吗?在我看来,这比嵌套的括号要清楚得多

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 }}}};
  ...

如果你想要的话,可以直接初始化A和B。< / P>你想初始化哪个联盟成员?你只能一次使用一个。在代码中没有“代码>联盟联合<代码>,<代码> unn>代码>和匿名<代码>结构>代码>。要初始化什么?C或C++,这不能都是。特别是在C中。您需要使用<代码> TyPulfF/COD>来使用结构名作为类型,但是您不需要在C++中使用它。请在中使用构造函数。您想初始化哪个联盟成员?您只能一次使用一个。没有代码<联> <代码>,<代码> UNN<代码>和匿名< COD。E>结构>代码,代码是什么?C或C++,它不能同时使用。特别是,在C中,你需要使用<代码> TyPulfF/Cux>能够使用结构名称作为一种类型,但是你不需要在C++中使用。做正确。在你的代码>联合< /C>中使用一个构造器。加上奖金,一旦C++的命名要求得到解决,这将起作用。(猜什么?)C++。加上奖励,一旦C++的命名要求被解决,这将起作用(猜什么?)C++是一个完全不同的问题的答案。我自己也经常犯这种错误,所以没有投票,但是你编译了吗?不,我没有时间编译,但我只想勾勒出这个问题的问题。问题是OP需要一个静态初始化。你的答案使用一个赋值。编译问题是<代码> > AXSt.Xyz 有一个名为“代码> XYZ 的成员,它没有。它有一个结构名为“代码> XYZ < /Cord>”,但不提供该成员的名称。C++中没有KoSH,但在C中,<代码> XYZ >存在命名方程的排序,可以访问<代码> AgStut.Rev < /C>和aStruct.IDs。对不同问题的一个相当完整的答案。我自己也时常为此感到内疚,所以没有否决票,但你编译了这个吗?没有,我没有时间编译,但我只是想概述一下在这种情况下的问题。问题是OP需要静态初始化。你的答案使用赋值。cOppNew问题是 AsStut.Xyz 说,代码> AgStuts有一个成员名为“代码> XYZ ,它有一个结构名为“代码> XYZ ”,但不提供该成员的名称。C++中没有KoSH,但在C中,<代码> XYZ >存在命名方程中的“滴”,并且可以访问<代码> AsStutt。.Rev和

aStruct.IDs