声明 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# 中,在实例化对象时总是省略 class
和 struct
关键字。
至于别名指针,我完全同意,我有点不喜欢,虽然这也可以看作是基于意见。
所以回答你的直接问题:
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 var
、struct Bar var
、Baz var
是有效的,但普通的 Foo var
或 Bar 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
仅用于声明类型,而不是使用它。
我在 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# 中,在实例化对象时总是省略 class
和 struct
关键字。
至于别名指针,我完全同意,我有点不喜欢,虽然这也可以看作是基于意见。
所以回答你的直接问题:
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 var
、struct Bar var
、Baz var
是有效的,但普通的 Foo var
或 Bar 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
仅用于声明类型,而不是使用它。