【问题标题】:In C, when do structure names have to be included in structure initializations and definitions?在 C 中,何时必须在结构初始化和定义中包含结构名称?
【发布时间】:2013-10-28 00:49:28
【问题描述】:

我正在阅读 K&R 的 The C Programming Language,在结构部分中我遇到了这些代码 sn-ps:

struct maxpt = { 320, 200 };

/* addpoints: add two points */
struct addpoint(struct point p1, struct point p2)
{
    p1.x += p2.x;
    p1.y += p2.y;
    return p1;
}

在第一种情况下,它看起来像是将值 320 和 200 分配给变量 maxpt 的成员。但是我注意到缺少结构类型的名称(不应该是“struct struct_name maxpt = {320, 200}”吗?在第二种情况下,函数返回类型只是“struct”而不是“struct name_of_struct”。

我不明白为什么它们不包含结构名称 - 它如何知道它正在处理的特定类型的结构?我的困惑是因为在以前的 sn-ps 中它们确实包含结构名称,例如在以下函数的返回类型中,它是“结构点”而不仅仅是“结构”。为什么它们在某些情况下包含名称而在其他情况下不包含?

/* makepoint: make a point from x and y components */
struct point makepoint(int x, int y)
{
    struct point temp;
    temp.x = x;
    temp.y = y;
    return temp;
}

【问题讨论】:

  • 您参考的是哪个版本?这是在哪个页面上?
  • struct maxpt = { 320, 200 }; 不会编译。我几乎确定这实际上不在你的书中。如果是,那就错了。
  • 我对您所指的 K&R 中的部分隐约熟悉,有跨页进行的对话,有时第 x 页上的声明将对变量定义进行观察在第 x-3 页创建。在那本书中很常见。
  • @CarlNorum,是的...typedef struct { int a, int b } TEMP; 然后TEMP temp = {234, 345 };
  • 是的,有什么作用?该示例中没有缺少标记,struct 关键字是,因为typedef。 OP的问题没有这种情况。

标签: c struct structure


【解决方案1】:

我的 K&R 副本包含在第 128 页:

struct point maxpt = { 320, 200 };

在第 130 页:

struct point addpoint(struct point p1, struct point p2)
{
    p1.x += p2.x;
    p1.y += p2.y;
    return p1;
}

这是第二版,第 47 次印刷,2011 年 2 月。

如果您的 K&R 副本包含其他内容,我认为这是错误的。

【讨论】:

  • 很好,证实了我对变量定义和使用之间跨越许多页面的对话的模糊回忆。 :)
  • 非常感谢您解决这个问题。我使用的电子书副本到目前为止有相当多的语法错别字,所以我并不惊讶错误也延伸到重要部分。
  • 不错的收获?很明显,即使没有看,OP 也错误地引用了这本书。
  • @Tyler 如果您的 K&R 电子书副本在您的问题中存在错误,请将其删除,因为 a) 它会严重误导您,并且 b) 它是被盗财产。
  • @Jim:我没有错误引用任何内容。话虽如此,我开始认为印刷版值得投资。
【解决方案2】:

这是一个错字。我有一个副本女巫在第 115 页有同样的错误,应该是struct point maxpt = { 320, 200 };

后面没有变量列表的结构声明 不保留存储空间;它仅仅描述了一个模板或形状 结构体。但是,如果声明被标记,则可以使用该标记 稍后在结构实例的定义中。例如,给定 上面point的声明,

 struct point pt;

定义了一个变量pt,它是一个`struct point`类型的结构。一个结构可以按照它的初始化 带有初始化器列表的定义,每个初始化器都是一个常量表达式, 会员:

struct maxpt = { 320, 200 };

自动结构也可以通过赋值或调用返回 正确类型的结构。

在第 117 页:

下一步是一组对点进行算术运算的函数。为了 例如,

/* addpoints: add two points */
struct addpoint(struct point p1, struct point p2)
{
    p1.x += p2.x;
    p1.y += p2.y;
    return p1;
}

这里的参数和返回值都是结构。我们 增加 p1 中的组件,而不是使用显式 临时变量,强调传递结构参数 像其他任何人一样按价值计算。

【讨论】:

  • BSH:你的是印刷本还是电子书?
  • 嗯,看起来电子书版本有点损坏了。我以前从未在教科书的电子版中遇到过这种情况。我猜是时候花钱买印刷版了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多