结构体定义和设置结构体成员

3
我想了解为什么使用这个结构定义,我们可以直接使用名称event来给结构成员赋值。我见过其他定义,其中使用struct关键字来赋值。
struct {
    int eventNum;
    int eventType;
} event;

void function() {
    event.eventNum = 10; 
}
3个回答

4
struct Name {int stuff; int data;} variable;

这只是与int variable;相同的东西,所以,这是一个普通变量,但具有复杂的特性,或者就像评论中指出的那样,是一个派生类型。


struct Name {int stuff;} variable;struct {int stuff;} variable; 不完全相同,因为第二个是不完整的结构体变量声明。 - 0___________
1
@PeterJ,没错,但我认为在这种情况下这不是什么大问题。 - ForceBru
1
@PeterJ,这个问题在[tag:c]标签下有914个相关问题。而且仅关于struct的问题就有超过十万个。所以,这大约占所有仅关于structs的问题的0.9%。在我看来,这并不是什么大问题...然而,这绝对很重要。 - ForceBru
1
@PeterJ,如果你在标签中加入 [tag:c++](因为它也有“struct”的概念),你将会得到1785个关于不完整结构体的问题/219004个关于“struct”的问题=_0.815%_。 - ForceBru
3
struct { int stuff; } variable; 中,一旦到达 },结构类型就是完整的。它只是一个无名类型;因为没有标签允许该类型被命名,所以不能创建其他相同类型的变量 — 尽管您可能能够在其他翻译单元中创建兼容的类型(标准中的这部分内容很难理解)。 - Jonathan Leffler
显示剩余2条评论

4
在你的代码片段中,event是一个未命名结构体的实例,一个未初始化的全局变量。在全局范围内,未初始化的对象所有成员都被初始化为其类型的零值。
函数function()可以使用event名称来引用此对象并将一个值赋给其中一个成员:event.eventNum = 10;
你可能见过像这样的初始化结构体定义:
struct {
    int eventNum;
    int eventType;
} event = { 10, 0 };

或者像这样的C99特定初始化程序:
struct {
    int eventNum;
    int eventType;
} event = { .eventNum = 10 };

这些定义可以出现在全局或局部范围内,并定义一个已初始化的对象event


-1

你声明了一个全局变量event,它的类型是一个"无标签""不完整"(这是一个针对语言专家的问题,如何正确称呼它)结构体struct { int ventNum; int eventType; }。由于它是全局变量,因此在整个程序范围内包括你的函数中都可见。


3
这不是一个不完整的类型。标准将不完整类型定义为“缺乏足够信息以确定该类型对象的大小”。 - ad absurdum
那么如何正确地称呼它呢?我使用(以及我认识或与之合作的许多人)无名作为派生的名称有点模糊,我认为它没有给出确切的描述。 - 0___________
1
标准没有为未使用标签定义的结构类型提供简称。例如,§6.7.2.3 标签 使用迂回曲折的说法:在不同作用域或使用不同标签的两个结构、联合或枚举类型的声明声明了不同的类型。每个不包括标签的结构、联合或枚举类型的声明都声明了一个不同的类型。 使用“无标签”或“无名称”的术语是不过分的。术语“匿名”通常不合适;它有一个特定的含义。在 typedef struct { … } Name; 中,该类型具有名称但没有标签。 - Jonathan Leffler
1
因此,无标签将是最合适的。 - 0___________
1
我同意,在缺乏更正式的术语时,“无标签”是最好的选择,因为它简洁准确。尽管拼写检查器坚持需要波浪形红线,但我会将其拼写为无连字符的形式。 - Jonathan Leffler
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接