c 结构的初始化,包括联合
Posted
技术标签:
【中文标题】c 结构的初始化,包括联合【英文标题】:Initialization of c struct including union 【发布时间】:2021-04-09 14:32:21 【问题描述】:我想用以下值初始化以下结构的ColourModelBlock
:
extension_size = 4
model = 0
red = 0
green = 0
blue = 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_size
和 model
,但我不知道如何设置联合值)或使用 memcpy
的 int
数组。
但我对 C 很陌生,所以我可能把它搞砸了。
【问题讨论】:
【参考方案1】:首先,您必须先声明ColourModelBlock
,然后再使用它来定义ColourModelBlock
。
然后,关于如何初始化ColourModelBlock
,有几种选择。首先,要初始化结构,您可以在大括号中列出它们的值。当涉及联合时,联合的第一个成员被初始化:
ColourModelBlock x = 4, 0, 0, 0, 0 ;
这里的内括号遵循ColourModelBlock
的结构,对每个包含的struct
或union
使用。编译器将接受没有这些大括号的代码并以相同的顺序进行初始化,但它可能会警告您,最好使用大括号,因为它有助于捕获错误。
其次,您可以使用成员名称来指示您正在使用每个值初始化哪个成员。这也将允许您通过第一个以外的成员初始化联合,尽管这里没有这样做:
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】:red
green
和 blue
字段位于名为 rgb
的结构内,位于名为 data
的联合中。如果你有一个名为 colourModelData
的 ColourModelData
类型的变量,你可以像这样设置它的 RGB:
colourModelData.data.rgb.red = 0;
colourModelData.data.rgb.green = 0;
colourModelData.data.rgb.blue = 0;
【讨论】:
以上是关于c 结构的初始化,包括联合的主要内容,如果未能解决你的问题,请参考以下文章