#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 ++中完美地编译。
但是当我将Header结构更改为:
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编程语言书中的Storage Allocator的实现中使用了类似的结构。我以为是同一回事,但我知道并非如此。此后,我也在其他地方见过。我当然更熟悉第一个版本。第二个是什么意思,为什么它甚至存在?有什么区别?
答案 0 :(得分:6)
struct Header {};
引入了名为struct
的{{1}}类型。
Header
引入了一个匿名结构类型,以及该匿名类型的别名typedef struct {} Header;
。
Header
引入了一个匿名结构类型和一个名为struct {} Header;
的匿名类型变量。
当没有名为Header
的类型(最后一种情况)时,Header
引入一个没有主体的名为struct Header header;
的{{1}}类型,然后尝试创建变量{ {1}}。
答案 1 :(得分:1)
在编译下面的部分时
struct {
unsigned long long int alignment;
} Header;
struct
没有标记,称为匿名结构类型。
struct Header header;
编译器会产生类似
的错误Header header”类型不完整,无法定义struct Header 标头
因此,在这些情况下,最好typedef
struct
。对于例如
typedef struct {
unsigned long long int alignment;
} Header;
答案 2 :(得分:1)
简单来说,编译器会看到“ Header”,并且没有以前的或内置的“ Header”数据类型,因此它不知道它是什么。使用时
root@35f54d7d290f:~# exit
exit
编译器可以说,用户告诉我一个定义的数据类型,现在我可以在代码中稍后引用一些东西。