声明 struct Name 是否使 Name 等同于 struct Name?

Does declaring struct Name make Name equivalent to struct Name?

我在 c/c++ 中使用 struct 时有点困惑。传统上,当我使用 struct 时,我通常将其用作:

typedef struct Name{
    int a;
};

Name var;

虽然这被认为是一种不好的做法from Linus,但它在某种程度上很常见。

然而,我想知道

struct Name{
    int a;
};
Name var;

好像是一样的,typedef真的有必要吗? 其实不应该

struct Name{
    int a;
};
struct Name var;

为什么省略了“姓名”中的 struct?如果它总是可以省略,那是否意味着 typedef struct 完全没有用?

在初始化变量时始终使用 struct 关键字可能会很长(或您认为的任何时间)。这就是为什么有一个 typedef 关键字(尽管它也有许多其他用途)。

您可以像这样使用 typedef 声明结构:

typedef struct{
    int a;
}var;

struct Name{
    int a;
};

typedef struct Name var;

然后像这样使用它:

var my_age;

然而,上面的解释仅涵盖C,而在C++中,结构类似于类,但它们的成员默认为public。

因此,在 C++ 中,您可以直接使用结构的名称,而无需再次键入 struct 关键字 n 再次

struct Name {
    int a;
};

Name my_age;

对于:

typedef struct Name{
    int a;
};

Name var;

定义应该是:

typedef struct Name{
    int a;
} Name;

Name var;

否则你不是在给类型取别名。


在 C++ 中,这没有意义,当您声明 struct Name 时,您已经可以实例化 Name,省略 struct 关键字,就像您在第二个代码片段中所做的那样,不适用于 C。它的行为类似于class,在这方面,你不声明class Name var;,只是Name var;

在 C 中,我不同意这是一种不好的做法,它是用户定义的类型,如果可以省略它,为什么总是使用 struct,任何名副其实的程序员都应该能够识别一个用户定义的类型,这不是火箭科学。这是基于意见的。如果这是不好的做法,我们将需要修改整个概念,不仅在 C++ 中,而且在 C# 中,在实例化对象时总是省略 classstruct 关键字。

至于别名指针,我完全同意,我有点不喜欢,虽然这也可以看作是基于意见。

所以回答你的直接问题:

Seems to serve the same purpose, is typedef really necessary?

对于您在 C 中描述的目的,在 C++ 中不。

Why is the struct from "Name" omitted?

在 C 中它不能被省略,除非你 typedef 将它插入,在 C++ 中它不仅可以,而且应该,它根本不需要。

If it can always be omitted, does that mean typedef struct is totally useless?

如您所见,它并非毫无用处。

在 C 和 C++ 中,规则不同。您显示的代码显然是 C++,无法在 C 中编译。

定义如下:

struct Foo {
    /*fields*/
};

typedef struct Bar {
    /*fields*/
} Baz;

在 C 中,变量声明 struct Foo varstruct Bar varBaz var 是有效的,但普通的 Foo varBar var 不是。在 C++ 中,所有此类变量声明都是有效的。因此,C 代码通常如下所示:

struct Foo {
    /*fields*/
};

typedef struct {
    /*fields*/
} Baz;

struct Foo var1;
Baz var2;

而在C++中,典型的形式是:

struct Foo {
    /*fields*/
};

Foo var;

UPD:从技术上讲,那是因为在 struct Foo {... 中,C 类型名称是 struct Foo;而在 C++ 中,名称只是 Foo,而 struct 仅用于声明类型,而不是使用它。