我的讲师坚持以下是一个有效的 C++ 语句,这让我大吃一惊:
struct charlistrecord *next
在 C/C++ 中声明递归数据类型时发现了完整的条件,如下所示:
typedef struct charlistrecord
{
char data;
struct charlistrecord *next;
} *charlist;
我想知道是否曾经有一段时间这是被接受的语法,或者我是否已经愚蠢了几个月,以为我知道 C++。
在 C++ 和 typedef 假设之前,获得类型化结构的唯一方法是通过这种语法,它是获得自类型链接节点的唯一方法。
struct Foo
{
int val;
struct Foo *link;
};
在 C 中,这要求 Foo 的任何用法为:
struct Foo foo;
struct Foo *foo_ptr;
ETC..
typedef 通过这样做帮助了这一点:
typedef struct Foo
{
int val;
struct Foo *link;
} Foo;
从现在开始你可以这样做:
Foo foo; // same as struct Foo
Foo *foo_ptr; // same as struct Foo *
注意:使用 typedef 给 a 起别名struct Name
并不限于Name
作为别名。你也完全可以这样做:
typedef struct Foo
{
int val;
struct Foo *link;
} Bar;
现在以下是可行的;
struct Foo foo;
Bar bar;
struct Foo *fooptr = &bar;
Bar *barptr = &foo;
真的让你希望你在那天用 C 编程,不是吗?可能没有把事情弄清楚,但希望少一点灰色。
这是 C 的遗留问题。在 C 中,这是你必须声明结构变量和成员的方式,因此出于向后兼容性的原因,它在 C++ 中是合法的。听起来你的讲师有点“老派”。
是的,它完全有效。这里的词struct
只是明确指出它next
是一个指向名为 的结构类型的指针charlistrecord
。
这是对 C 的回忆,你不妨省略 C++ 中的关键字,但如果你想使用它,你可以。
这是完全有效的,如果你的结构的名称被变量遮蔽,它甚至会很有用,如下所示:
struct C {};
int C = 0;
int a;
void foo() {
C *a; // multiplies int C by int a
struct C *a; //defines 'a' as pointer to struct C
}