"struct type variablename"声明有效吗?

Is "struct type variablename" valid as a declaration?

本文关键字:有效 variablename struct type 声明      更新时间:2023-10-16

我的讲师只是坚持认为以下是有效的C 语句:

struct charlistrecord *next

在宣布C/C 的递归数据类型时发现了完整条件:

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

我想知道是否有一段时间被接受语法,还是我只是愚蠢的几个月以为我知道C 。

在c 和typedefs的假设之前,获得打字结构的唯一方法是通过此语法,这是获得自我的唯一的方法-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 *

注意:使用类型为别名,struct Name不仅限于Name作为别名。Yo也可以做到这一点:

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结构类型的指针 naty charlistrecord

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

它是完全有效的,如果您的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
}