首页 > 解决方案 > struct S { int align; 之间的区别 }; (结构关键字后的名称)和 struct { int align; } S; (结构定义后的名称)

问题描述

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

标签: c++cstructkernighan-and-ritchie

解决方案


struct Header {};引入了一个struct名为Header.

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

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

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


推荐阅读