使用复合文字初始化指向结构的指针

avy*_*avy 2 c pointers compound-literals

我是 C 的新手,我正在尝试理解复合文字的语法。我的问题类似于在 C 中初始化指向复合文字的指针,但我认为这不能回答它。如果有一个结构体和一个类型定义为指向结构体的指针,如下所示:

typedef struct thing *thing_t;
struct thing
{
    int id;
    char *name;
};
Run Code Online (Sandbox Code Playgroud)

然后我可以创建一个thing_t这样的:

thing_t instance = & (struct thing) {
    .id = 1,
    .name = "A"
};
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种方法可以在thing_t不显式引用的情况下初始化 a struct thing,例如我试过这个以查看它是否是有效的语法:

thing_t instance = (* thing_t) {
    .id = 1,
    .name = "A"
};
Run Code Online (Sandbox Code Playgroud)

但编译器错误。编译器必须“知道”该thing_t类型包含一个指向 a 的指针thing,但是是否有语法允许在此上下文中可互换地使用这两者?

(我没有一个特定的用例,我只是想了解类型和结构是如何相关的)。

Joh*_*ger 5

我想知道是否有一种方法可以在thing_t不显式引用的情况下初始化 a struct thing,例如我试过这个以查看它是否是有效的语法:

thing_t instance = (* thing_t) {
    .id = 1,
    .name = "A"
};
Run Code Online (Sandbox Code Playgroud)

但编译器错误。编译器必须“知道” thing_t 类型持有一个指向事物的指针,

是的,确实如此,尽管定义一个隐藏指针性质的类型别名是一种糟糕的形式,就像你所做的那样,而且使用一个不以某种方式提供线索的名称来这样做尤其糟糕。

但是是否有允许在这种情况下互换使用这两者的语法?

复合文字的语法包括带括号的类型说明符。这不是演员表,它是文字本身的一部分。你不能没有它。struct但是,如果您想避免说,那么您可以通过更改类型别名来用一块石头杀死两只鸟,以便它描述结构类型本身,而不是指向一个的指针:

typedef struct thing thing_t;
struct thing {
    int id;
    char *name;
};
thing_t *instance = & (thing_t) {
    .id = 1,
    .name = "A"
};
Run Code Online (Sandbox Code Playgroud)

它不仅有效,而且比你的提议清晰得多。例如,&运算符的使用与变量instance作为指针的明确声明相匹配。