初始化指向具有复合文字

时间:2018-06-14 14:37:13

标签: c pointers compound-literals

我是C的新手,我试图理解复合文字的语法。我的问题类似于Initializing a pointer to compound literals in 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而没有明确提及struct thing,例如我试过这个看看它是否是有效的语法:

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

但编译错误。编译器必须"知道" thing_t类型是否包含指向thing的指针,但是是否存在允许在此上下文中可互换使用两者的语法?

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

1 个答案:

答案 0 :(得分:2)

  

我想知道是否有办法初始化thing_t没有   明确提到struct thing,例如我试过这个看看它   是有效的语法:

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

但编译错误。编译器必须“知道”thing_t   type保存指向事物的指针,

是的,确实如此,虽然定义一个隐藏指针性质的类型别名是不好的,正如你所做的那样,并且特别是这样做的形式不好,而且名称不是以某种方式提供了一个线索。

  

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

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

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

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