“结构类型variablename”作为声明是否有效? 我的讲师让我吃惊的是,坚持下面的是一个有效的C++语句: struct charlistrecord *next

“结构类型variablename”作为声明是否有效? 我的讲师让我吃惊的是,坚持下面的是一个有效的C++语句: struct charlistrecord *next,c++,syntax,C++,Syntax,在C/C++中声明递归数据类型时发现完整条件,如下所示: typedef struct charlistrecord { char data; struct charlistrecord *next; } *charlist; 我想知道是否有一段时间是被接受的语法,还是我已经沉默不语了几个月的思考我知道C++。< /P> < P>这是C. C中的一个宿醉,这就是你必须声明结构变量和成员,所以在C++中,由于向后兼容性的原因,它是合法的。听起来你的讲师有点“老学校”。 < P

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

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

<>我想知道是否有一段时间是被接受的语法,还是我已经沉默不语了几个月的思考我知道C++。< /P> < P>这是C. C中的一个宿醉,这就是你必须声明结构变量和成员,所以在C++中,由于向后兼容性的原因,它是合法的。听起来你的讲师有点“老学校”。

< P>这是C. C中的宿醉。这是你必须声明结构变量和成员的原因,所以在C++中,由于向后兼容性的原因,它是合法的。听起来你的讲师有点“老派”。

是的,这是完全正确的。这里的单词struct只是显式地表示next是指向名为charlistrecord的结构类型的指针


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

<是的,它是完全有效的。这里的单词struct只是显式地表示next是指向名为charlistrecord的结构类型的指针


<>这是一个C的回忆,你可以省略C++中的关键字,但是如果你想使用它,你可以.C++之前的

和Type的假设,得到一个类型化结构的唯一方法就是通过这个语法,它是获得一个自类型链接节点的唯一方法。
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为结构名添加别名并不限于将Name作为别名。你也完全有理由这么做:

typedef struct Foo
{
    int val;
    struct Foo *link;
} Bar;
现在,以下是可行的

struct Foo foo;
Bar bar;
struct Foo *fooptr = &bar;
Bar *barptr = &foo;

真的让你希望你能在以前用C编程,不是吗?可能不清楚事情,但希望少一点灰色。

< P> C++前和Type Debug的假设,获得类型结构的唯一方法是通过这个语法,而这是获得自类型链接节点的唯一途径。
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为结构名添加别名并不限于将Name作为别名。你也完全有理由这么做:

typedef struct Foo
{
    int val;
    struct Foo *link;
} Bar;
现在,以下是可行的

struct Foo foo;
Bar bar;
struct Foo *fooptr = &bar;
Bar *barptr = &foo;

真的让你希望你能在以前用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
}

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

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
}

在末尾放一个分号,它是完全有效的。嗯,虽然这可能是有效的,但只有C程序员才能这样做。你不应该为此感到难过。你的讲师OTOH…C/C++?啊,那个神话般的不存在的语言…我加入了答案,它是有效的,还有一些关于用法的话:单链表是以这种方式实现的,在末尾放一个分号,它是完全有效的。嗯,虽然这可能是有效的,但只有C程序员才这样做。你不应该为此感到难过。你的讲师OTOH…C/C++?啊,那个神话般的不存在的语言…我加入了答案,它是有效的,还有一些关于用法的词语:单链表是以这种方式实现的。谢谢,我不清楚你说的“既然现在你可以这么做”是什么意思,你是说,只有以这种方式声明typedef之后,才能说Foo*Foo@这正是我要说的。如果没有typedef,Foo必须以struct开头。使用最后一个}Foo的typedef;将其公开为命名类型。顺便说一句,它可能是除}Foo以外的东西;也如果你愿意,我可以更新答案来证明。呃,谢谢,从你说‘既然现在你可以这么做’的角度来看,我不太明白你的意思。你是说,只有以这种方式声明typedef之后,你才能说Foo*Foo@这正是我要说的。如果没有typedef,Foo必须以struct开头。使用最后一个}Foo的typedef;将其公开为命名类型。顺便说一句,它可能是除}Foo以外的东西;也如果你愿意,我可以更新答案来证明这一点。