2

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

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

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

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

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

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

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

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

4

1 回答 1

5

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

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

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

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

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

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

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

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

于 2018-06-14T14:51:17.207 回答