我的讲师只是坚持认为以下是有效的C ++声明让我震惊:
struct charlistrecord *next
在C / C ++中声明递归数据类型时发现完整条件如下:
typedef struct charlistrecord
{
char data;
struct charlistrecord *next;
} *charlist;
我想知道是否曾经有过一段时间这是被接受的语法,或者我是否只是因为我认识C ++而感到愚蠢。
答案 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
}