C:结构定义中指向struct的指针

cla*_*laf 51 c struct pointers

如何在此结构的定义中指向下一个结构的指针:

typedef struct A {
  int a;
  int b;
  A*  next;
} A;
Run Code Online (Sandbox Code Playgroud)

这是我第一次写它但它不起作用的方式.

CB *_*ley 69

您可以定义typedef并在一个语句中首先声明struct,然后在后续定义中定义struct.

typedef struct A A;

struct A
{
    int a;
    int b;
    A* next;
};
Run Code Online (Sandbox Code Playgroud)

编辑:正如其他人所提到的,如果没有前向声明,结构名称在结构定义中仍然有效(即可以使用struct A),但是在typedef定义完成之后,typedef才可用(因此使用just A将无效).仅使用一个指针成员,这可能并不重要,但如果您有一个包含大量自我类型指针的复杂数据结构,则可能不那么狡猾.

  • 放松:C的许多编码风格约定强烈反对类型定义结构.我不会说这是规范的. (12认同)
  • @ephemient为什么我不能隐藏它?他们只是实施细节. (3认同)
  • 如果我可以投票评论,Chris Young会获得+1.原生类型和聚合结构之间存在巨大差异.**不要**隐藏在typedef后面. (2认同)

Chr*_*ung 60

除了第一个答案,没有typedef和forward声明,这也应该没问题.

struct A 
{ 
    int a; 
    int b; 
    struct A *next; 
};
Run Code Online (Sandbox Code Playgroud)


Mil*_*s D 17

你错过了struct之前的A*

  typedef struct A {
    int a;
    int b;
    struct A* next;
  } A;
Run Code Online (Sandbox Code Playgroud)


qrd*_*rdl 13

你可以不用前瞻声明:

struct A {
    int a;
    int b;
    struct A *next;
};
Run Code Online (Sandbox Code Playgroud)


eph*_*ent 8

拜托,你是C,而不是C++.

如果你真的必须键入一个结构(并且我使用的大多数程序员不会¹),请执行以下操作:

typedef struct _A {
    int a;
    int b;
    struct _A *next;
} A;
Run Code Online (Sandbox Code Playgroud)

明确区分_A(在struct命名空间中)和A(在类型命名空间中).

¹ typedef隐藏了它指向的类型的大小和存储 - 论证(我同意)是在像C这样的低级语言中,试图隐藏任何东西是有害的,适得其反.习惯了打字struct A时,你的意思struct A.

  • _A是保留名称.A_没问题. (4认同)
  • "struct A"如何告诉我它的大小? (2认同)
  • Nitpick:_A是一个坏名字:前导下划线属于编译器.[编辑]该死的,我想我只是回应了MSalters. (2认同)
  • 在我所有的编程过程中,我从未遇到过给结构体和 typedef 赋予相同名称的问题,然后我只在这种情况下为结构体命名(链接列表等)。我认为你只是在宣扬 FUD。您能举一个例子,说明两者同名会导致问题吗?另外,我从来没有在我的所有结构上使用 typedef 遇到任何问题,所以我发现你的论点是“有害且适得其反”有点过头了。 (2认同)