gpt4 book ai didi

c - 为什么在以下结构定义中需要显式转换

转载 作者:行者123 更新时间:2023-12-03 14:36:57 25 4
gpt4 key购买 nike

struct通过复合文字初始化,它将自己进行转换。例如:

struct movie {
char title[50];
int year;
};
typedef struct movie Item;

typedef struct node {
Item item;
struct node *next;
} Node;

typedef struct linkedlist {
Node *head;
size_t size;
} LinkedList;
LinkedList movies2 = {
.head=&(Node){{"Avatar", 2010}, NULL},
.size=1
};
但是,如果我将定义分开,则必须添加显式转换:
LinkedList movies2;
movies2 = (LinkedList) {
.head=&(Node){{"Avatar", 2010}, NULL},
.size=1
};
代码: https://godbolt.org/z/dG8nMh
如果我省略了 (cast_type)在第二个中,我会得到一个类似 error: expected expression before ‘{’ token 的错误.为什么会这样?
也就是说,为什么初始化不需要强制转换而另一个定义需要?我的想法是第二个版本应该能够在没有显式转换的情况下自行解决,但显然这是不正确的。

最佳答案

在这两种情况下,您都使用复合文字。
在声明中的第一种情况

LinkedList movies2 = {
.head=&(Node){{"Avatar", 2010}, NULL},
.size=1
};
您正在使用复合文字 (Node){{"Avatar", 2010}, NULL}类型 Node在初始化器列表中,其地址用作数据成员 head 的初始化器结构 LinkedList .
在第二种情况下,您首先创建了一个类型为 LimkedList 的对象。
LinkedList movies2;
然后您使用赋值运算符对创建的对象使用类型为 LinkedList 的复合文字
(LinkedList) {
.head=&(Node){{"Avatar", 2010}, NULL},
.size=1
}
那是
movies2 = (LinkedList) {
.head=&(Node){{"Avatar", 2010}, NULL},
.size=1
};
那就是没有任何类型转换。使用了两种不同的复合文字。 Node 类型之一,LinkedList 类型之一。
要说清楚。考虑一个简单的例子
int x = { 10 };
在变量 x 上方的声明中由整数常量 10 初始化。
你也可以这样写
int tmp = { 10 };
int x;
x = tmp;
这里创建了一个中间变量来初始化变量 x .复合文字实际上是一个未命名的对象。上面的代码可以改写成
int x;
x = ( int ){ 10 };
这里没有任何类型转换。这个表达式 ( int ){ 10 }创建类型为 int 的未命名对象它由整数常量 10 初始化。并将这个新创建的未命名对象分配给变量 x .
另请参阅以下问题 What are the advantages of using “{}” for casting in C Language?

关于c - 为什么在以下结构定义中需要显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66571889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com