“struct type variablename”是否有效作为声明?

时间:2012-11-08 10:10:29

标签: c++ syntax

我的讲师只是坚持认为以下是有效的C ++声明让我震惊:

struct charlistrecord *next

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

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

我想知道是否曾经有过一段时间这是被接受的语法,或者我是否只是因为我认识C ++而感到愚蠢。

4 个答案:

答案 0 :(得分:2)

在使用C ++和假定typedef之前,获取类型化结构的唯一方法是通过这种语法,并且它是唯一方式来获得自我类型链接节点。

struct Foo
{
    int val;
    struct Foo *link;
};

在C中,这需要使用Foo:

struct Foo foo;
struct Foo *foo_ptr;

等。

通过这样做,typedef对此有所帮助:

typedef struct Foo
{
   int val;
   struct Foo *link;
} Foo;

从现在开始你可以这样做:

Foo foo;       // same as struct Foo
Foo *foo_ptr;  // same as struct Foo *

注意:使用typedef为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编程,不是吗?可能不会清除事情,但希望不那么灰色。

答案 1 :(得分:1)

这是C的宿醉。在C中,这是你必须声明结构变量和成员的方式,所以它在C ++中是合法的,因为它们具有向后兼容性。听起来你的讲师有点“老派”。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

它是完全有效的,如果你的struct的名字被变量遮蔽,它甚至会很有用,就像这里:

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
}