结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al

Difference between struct S { int align; }; (name after struct keyword) and struct { int align; } S; (name after the struct definition)

本文关键字:struct int al 关键字 区别 align 之间 结构体      更新时间:2023-10-16
#include <stdio.h>
struct Header
{
unsigned long long int alignment;
};
int main(void)
{
struct Header header;  // note: we can loose the 'struct' in C++
struct Header* pheader = &header;
return 0;
}

上面的程序在 C 和 C++ 中都能完美编译。

但是当我将标题结构更改为:

struct {
unsigned long long int alignment;
} Header;

它在 C 中失败并显示以下消息:error: storage size of ‘Header’ isn’t known

在C++:error: aggregate ‘main()::Header header’ has incomplete type and cannot be defined struct Header header;

类似的结构在K&R的C编程语言书中实现存储分配器时使用。我以为这是一回事,但我知道事实并非如此。从那以后,我也在其他地方看到过。我当然更熟悉第一个版本。第二个是什么意思,为什么它甚至存在?有什么区别?

struct Header {};引入了一个名为Headerstruct类型。

typedef struct {} Header;引入了匿名结构类型,以及该匿名类型的别名Header

struct {} Header;引入了匿名结构类型和名为匿名类型的Header变量。

当没有名为Header的类型(最后一种情况(时,struct Header header;引入一个名为Header的不带主体的struct类型,然后尝试创建该类型的变量header

当你编译下面的部分时

struct {
unsigned long long int alignment;
} Header;

struct没有标记,则称为匿名结构类型。

struct Header header;

编译器产生类似

标头标头

"的类型不完整,无法定义结构标头 页眉

因此,在这些情况下,最好typedefstruct。例如

typedef struct {
unsigned long long int alignment;
} Header;

简单来说,编译器看到的是"Header",并且没有以前或内置的数据类型"Header",所以它不知道它是什么。当您使用

typedef struct header {
....
} Header;

编译器可以说嘿,用户告诉我一个定义的数据类型,现在我可以稍后在代码中引用一些东西。