struct S {int align; }; (struct关键字后面的名称)和struct {int align; S; (结构定义后的名称)

Nik*_*kos 5 c c++ struct kernighan-and-ritchie

#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;
}
Run Code Online (Sandbox Code Playgroud)

上面的程序在C和C++中完美编译.

但是当我将Header结构更改为:

struct {
    unsigned long long int alignment;
} Header;
Run Code Online (Sandbox Code Playgroud)

它失败并在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编程语言书中,存储分配器的实现中使用了类似的结构.我认为这是一回事,但我知道事实并非如此.我也曾在其他地方见过.我当然更熟悉第一个版本.第二个是什么意思,为什么它甚至存在?有什么不同?

Yak*_*ont 6

struct Header {};介绍一个struct名为的类型Header.

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

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

如果没有命名类型Header(最后一种情况),则struct Header header;引入一个struct名为Headerwithout body 的类型,然后尝试创建header该类型的变量.