我是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
的指针,但是是否存在允许在此上下文中可互换使用两者的语法?
(我没有特定的用例,我只是想了解类型和结构是如何相关的。)
答案 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
的明确声明作为指针匹配。