#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 {};
引入了一个名为Header
的struct
类型。
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;
编译器产生类似
标头标头"的类型不完整,无法定义结构标头 页眉
因此,在这些情况下,最好typedef
struct
。例如
typedef struct {
unsigned long long int alignment;
} Header;
简单来说,编译器看到的是"Header",并且没有以前或内置的数据类型"Header",所以它不知道它是什么。当您使用
typedef struct header {
....
} Header;
编译器可以说嘿,用户告诉我一个定义的数据类型,现在我可以稍后在代码中引用一些东西。