【发布时间】:2021-06-08 19:37:22
【问题描述】:
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 的错误。为什么会这样?
也就是说,为什么初始化不需要强制转换,而其他定义却需要?我的想法是第二个版本应该能够在没有显式转换的情况下自行解决,但显然这是不正确的。
【问题讨论】:
-
这将有助于显示这些东西的定义。
-
我认为这是未定义的行为。您正在使用临时地址,一旦超出范围就会被丢弃。演员表是“必要的”,因为默认情况下它不想工作。
-
您可以将数组分配给结构变量类型吗?
-
@tadman 更新了结构。
-
(LinkedList) {}不是演员表。它是复合文字的语法,您似乎知道。
标签: c struct initialization literals compound-literals