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

时间:2018-10-25 02:17:44

标签: 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;
}

上面的程序可以在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的实现中使用了类似的结构。我以为是同一回事,但我知道并非如此。此后,我也在其他地方见过。我当然更熟悉第一个版本。第二个是什么意思,为什么它甚至存在?有什么区别?

3 个答案:

答案 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

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