【问题标题】:Initialize pointer to a struct with a compound literal使用复合文字初始化指向结构的指针
【发布时间】:2018-06-14 14:37:13
【问题描述】:

我是 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"
};

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

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

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

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

【问题讨论】:

  • 不要将指针隐藏在 typedef 后面。 typedef struct thing thing_t; - 问题解决了。
  • 试试->而不是.,这可能会奏效
  • 当您是 C 新手时,在使用指向复合文字的指针时可能需要注意生命周期。

标签: c pointers compound-literals


【解决方案1】:

我想知道是否有一种方法可以初始化 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 明确声明为指针相匹配。

【讨论】:

  • 不错。我已经离开 C 有一段时间了,并且正在或多或少地“通过积累”来学习 C99 的特性。感谢结构文字语法和按名称成员初始化的示例。两者都是对 C89/90 语言的很好的补充。
  • 这可能适用于文件范围,但我没有看到问题或此答案中明确说明。在函数内部,复合文字具有与其封闭块关联的自动存储持续时间,因此应谨慎使用其地址。
  • 这是一个有用的观察,@Eric。事实上,这个问题并没有涉及复合字面量表示的对象的生命周期,我只回答了所问的问题,但对象生命周期是如何使用诸如 OP 获取的指针的一个重要考虑因素。跨度>
  • 我只是在阅读一本书的同时编写玩具程序,所以在这种情况下并不重要。虽然有用,但我没有想过为什么它需要与字符串文字不同。感谢@JohnBollinger 的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多