我们声明结构的两种方式有什么区别?

Pus*_*jan 4 c++ syntax

作为C++的初学者,我正在学习链表和其他数据结构.在线查看了一些实现后,我发现了这两种定义struct的方法.两者有什么区别.在一个中,我们在下一个指针之前添加"struct",而在一个中我们不添加.

方式1:

struct node
{
   int data;
   node *next;
};
Run Code Online (Sandbox Code Playgroud)

方式2:

struct node
{
   int data;
   struct node *next;
};
Run Code Online (Sandbox Code Playgroud)

Arn*_*rah 9

struct node *next;
Run Code Online (Sandbox Code Playgroud)

仅在C代码中是必需的.在C中,做:

node *next;
Run Code Online (Sandbox Code Playgroud)

不被允许.但是,在C++中,您可以使用这两种方法.在这种情况下,它们之间没有区别.

只有struct在存在某种歧义或struct尚未定义的情况下,您才需要在C++中使用关键字进行声明.(对于第一那份一个实例stat函数,这是一个功能一个struct上POSIX系统).


eer*_*ika 8

两者有什么区别.

不同之处在于后者(称为详细类型说明符)声明它node是一个结构.

在这种情况下,声明它node是一个结构是多余的,因为它已经被声明:

struct node
^^^^^^^^^^^ <-- node is a struct
{
   int data;
   node *next;
};
Run Code Online (Sandbox Code Playgroud)

一个存在差异的案例:

struct a {
    //b* pointer;      // oops, we don't know what b is
    struct b* pointer; // OK, b is a struct
};

struct b{};
Run Code Online (Sandbox Code Playgroud)

通常并非绝对必须使用精心设计的类型说明符,因为可以使用单独的声明:

struct b;

struct a {
    b* pointer;
};

struct b{};
Run Code Online (Sandbox Code Playgroud)

他们之间的选择是个人偏好.


我说通常是因为有时你需要它来消除类型中同名变量的歧义:

int foo;
struct foo{};

int main()
{
    foo = 10;            // refers to int
    struct foo instance; // refers to the struct
}
Run Code Online (Sandbox Code Playgroud)

对于多个事物使用相同的名称通常是一个糟糕的设计,所以这不是很典型.


最后,有时需要编写可以包含在C和C++中的头文件.此标头必须使用两种语言的公共子集.

在C中,node不是类型名称,而是结构的标记.在C中有必要使用struct关键字引用struct标记.