2

a 的以下两个初始化有什么区别Struct

Car ford = {
    .name = "Ford F-150",
    .price = 25000
};

和:

Car dodge = (Car) {
    .name = "Ram",
    .price = 1000
};

Compiler Explorer中,看起来两者生成了相同的代码:

在此处输入图像描述


在结构之前做什么(StructName)?在进行复杂的初始化时似乎是必要的,例如:

CarPtr mazda = & (Car) {
    .name = "Mazda",
    .price = 20000
};

同样与可能初始化/分配结构指针的两个答案有关?.

4

1 回答 1

2

在这份声明中

Car dodge = (Car) {
    .name = "Ram",
    .price = 1000
};

创建了两个 Car 类型的对象。第一个是未命名的复合文字

(Car) {
    .name = "Ram",
    .price = 1000
}

用于初始化另一个命名对象的闪避。

来自 C 标准(6.5.2.5 复合文字)

3 后缀表达式由带括号的类型名称后跟括号括起来的初始值设定项列表组成,是复合文字。它提供了一个未命名的对象,其值由初始化列表给出。

实际上它类似于以下声明

Car ford = {
    .name = "Ford F-150",
    .price = 25000
};

Car dodge = ford;

不同之处在于,在上一个示例中,我们创建了一个多命名对象。

来自 C 标准(6.7.9 初始化)

13 具有自动存储持续时间的结构或联合对象的初始值设定项应为如下所述的初始值设定项列表,或具有兼容结构或联合类型的单个表达式。在后一种情况下,对象的初始值(包括未命名的成员)是表达式的初始值。

于 2021-01-06T22:25:31.433 回答