在C中,什么时候结构名称必须包含在结构初始化和定义中?

在C中,什么时候结构名称必须包含在结构初始化和定义中?,c,struct,structure,C,Struct,Structure,我正在阅读K&R的C编程语言,在结构一节中,我遇到了以下代码片段: struct maxpt = { 320, 200 }; 及 在第一种情况下,它看起来像是将值320和200分配给变量maxpt的成员。但是我注意到结构类型的名称丢失了(它不应该是“struct struct_name maxpt={320200}”?在第二种情况下,函数返回类型只是“struct”,而不是“struct的struct name_” 我不明白为什么它们不包含结构名-它如何知道它处理的是什么特定类型的结构?我的困

我正在阅读K&R的C编程语言,在结构一节中,我遇到了以下代码片段:

struct maxpt = { 320, 200 };

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

我不明白为什么它们不包含结构名-它如何知道它处理的是什么特定类型的结构?我的困惑是,在以前的代码片段中,它们确实包含结构名,例如在下面函数的返回类型中,它是“struct point”,而不仅仅是“struct”.为什么在某些情况下包含名称,而在其他情况下不包含名称

/* 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;
}

我的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副本包含其他内容,我认为这是错误的。

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

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

 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
中的组件,而不是使用显式 强调传递结构参数的临时变量 价值观和其他任何东西一样


您引用的是哪个版本?这是在哪个页面上?
struct maxpt={320200}
不会编译。我几乎可以肯定你的书中没有这方面的内容。如果是,那就是错的。我对你提到的K&R中的部分有点熟悉,有些对话是跨页面进行的,有时在第x页上的一条语句会对在第x-3页上创建的变量定义进行观察。Comm在那本书中出现。@CarlNorum,是的,它是…
typedef结构{int a,int b}TEMP;
then
TEMP={234,345}
是什么?在那个例子中,标签并没有丢失,
struct
关键字是,因为
typedef
。OP的问题没有这种情况。很好的捕捉,证实了我对变量定义之间跨越多页的对话的模糊回忆,并使用::)谢谢大家澄清这一点。我用的是一本到目前为止有相当多语法错误的电子书,所以我并不惊讶错误也延伸到了重要的部分。抓到了吗?很明显,OP甚至没有看一眼就错误地引用了这本书。@Tyler如果你有一本K&R的电子书在你的问题中有错误,那么就删除它,因为a)它会严重误导你,b)它是赃物。@Jim:我没有错误地引用任何东西。话虽如此,我开始认为一本印刷本值得投资。BSH:你的是印刷本还是电子书?嗯,看起来电子书版本不知怎么被破坏了。我以前从未在电子版教科书中遇到过这种情况。我想是时候用现金买一份印刷品了。
/* addpoints: add two points */
struct addpoint(struct point p1, struct point p2)
{
    p1.x += p2.x;
    p1.y += p2.y;
    return p1;
}