c 结构的初始化,包括联合

Posted

技术标签:

【中文标题】c 结构的初始化,包括联合【英文标题】:Initialization of c struct including union 【发布时间】:2021-04-09 14:32:21 【问题描述】:

我想用以下值初始化以下结构的ColourModelBlock

extension_size = 4model = 0red = 0green = 0blue = 0

typedef struct 
  int                           extension_size;
  ColourModelData               ext;
 ColourModelBlock;

typedef struct 

  unsigned int      model; 
  union 

    struct 
       int               red;                  /* % */
       int               green;                /* % */
       int               blue;                 /* % */
     rgb;

    struct 
       int               cyan;                 /* % */
       int               magenta;              /* % */
       int               yellow;               /* % */
       int               key;                  /* % */
     cmyk;

    struct 
      int               hue;                  /* angle (degrees) */
       int               saturation;           /* % */
       int               value;                /* % */
     hsv;

    char bytes[16];
    int  words[4];
   data;
 ColourModelData;

任务看起来很简单,但我尝试直接设置值(这适用于 extension_sizemodel,但我不知道如何设置联合值)或使用 memcpyint数组。

但我对 C 很陌生,所以我可能把它搞砸了。

【问题讨论】:

【参考方案1】:

首先,您必须先声明ColourModelBlock,然后再使用它来定义ColourModelBlock

然后,关于如何初始化ColourModelBlock,有几种选择。首先,要初始化结构,您可以在大括号中列出它们的值。当涉及联合时,联合的第一个成员被初始化:

ColourModelBlock x =  4,  0,  0, 0, 0   ;

这里的内括号遵循ColourModelBlock 的结构,对每个包含的structunion 使用。编译器将接受没有这些大括号的代码并以相同的顺序进行初始化,但它可能会警告您,最好使用大括号,因为它有助于捕获错误。

其次,您可以使用成员名称来指示您正在使用每个值初始化哪个成员。这也将允许您通过第一个以外的成员初始化联合,尽管这里没有这样做:

ColourModelBlock x = 
        .extension_size = 4,
        .ext = 
            .model = 0,
            .data.rgb =  0, 0, 0 
        
    ;

请注意,上面实际上使用了方法的组合。大多数成员都按名称进行初始化,称为指定初始化程序。但是.data.rgb 命名一个联合,然后用一个列表初始化它的成员,就像在第一种方法中一样。在rgb 成员被认为是三元组的情况下,这可能很自然。

您还可以定义一个对象,然后使用赋值语句为其赋值。上面的语法用于初始化。作业需要不同的语法:

ColourModelBlock x;
x.extension_size = 4;
x.ext.model = 0;
x.ext.data.rgb.red   = 0;
x.ext.data.rgb.green = 0;
x.ext.data.rgb.blue  = 0;

您可以使用 复合文字 在赋值中使用初始化语法。要创建复合文字并在赋值中使用它,请使用上面的任何初始化列表并将类型名称放在括号中,然后将其用作赋值的右侧:

x = (ColourModelBlock)  4,  0,  0, 0, 0   ;

最后,由于您想用作初始值的大多数值都是零,因此您可以省略它们。如果正在初始化一个结构,并且没有为所有成员提供显式值,则没有显式值的成员将被初始化为零(或者,对于指针,为空指针):

ColourModelBlock t =  4 ;

【讨论】:

【参考方案2】:

redgreenblue 字段位于名为 rgb 的结构内,位于名为 data 的联合中。如果你有一个名为 colourModelDataColourModelData 类型的变量,你可以像这样设置它的 RGB:

colourModelData.data.rgb.red = 0;
colourModelData.data.rgb.green = 0;
colourModelData.data.rgb.blue = 0;

【讨论】:

以上是关于c 结构的初始化,包括联合的主要内容,如果未能解决你的问题,请参考以下文章

C语言自定义数据类型:结构体,枚举,联合

C语言自定义数据类型:结构体,枚举,联合

C语言自定义数据类型:结构体,枚举,联合

自定义类型详解(结构体+枚举+联合)C进阶

详解C语言结构体枚举联合体

详解C语言结构体枚举联合体