2

我的讲师坚持以下是一个有效的 C++ 语句,这让我大吃一惊:

struct charlistrecord *next

在 C/C++ 中声明递归数据类型时发现了完整的条件,如下所示:

typedef struct charlistrecord
{
     char data;
     struct charlistrecord *next;
} *charlist;

我想知道是否曾经有一段时间这是被接受的语法,或者我是否已经愚蠢了几个月,以为我知道 C++。

4

4 回答 4

2

在 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 编程,不是吗?可能没有把事情弄清楚,但希望少一点灰色。

于 2012-11-08T10:16:06.580 回答
1

这是 C 的遗留问题。在 C 中,这是你必须声明结构变量和成员的方式,因此出于向后兼容性的原因,它在 C++ 中是合法的。听起来你的讲师有点“老派”。

于 2012-11-08T10:11:54.550 回答
1

是的,它完全有效。这里的词struct只是明确指出它next是一个指向名为 的结构类型的指针charlistrecord

这是对 C 的回忆,你不妨省略 C++ 中的关键字,但如果你想使用它,你可以。

于 2012-11-08T10:12:21.647 回答
0

这是完全有效的,如果你的结构的名称被变量遮蔽,它甚至会很有用,如下所示:

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
}
于 2012-11-08T10:25:51.810 回答