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

Initialize pointer to a struct with a compound literal

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

typedef struct thing *thing_t;
struct thing
{
    int id;
    char *name;
};

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

thing_t instance = & (struct thing) {
    .id = 1,
    .name = "A"
};

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

thing_t instance = (* thing_t) {
    .id = 1,
    .name = "A"
};

但是编译器出错。编译器必须 "know" thing_t 类型持有指向 thing 的指针,但是是否存在允许在此上下文中互换使用两者的语法?

(对此我没有特定的用例,我只是想了解类型和结构之间的关系)。

I was wondering if there is a way to initialize a thing_t without explicitly referring to struct thing, e.g. I tried this to see if it was valid syntax:

thing_t instance = (* thing_t) {
    .id = 1,
    .name = "A"
};

but the compiler errors. The compiler must "know" that the thing_t type holds a pointer to a thing,

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

but is there syntax that allows to use the two interchangably in this context?

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

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

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