58

我怎样才能在这个结构的定义中有一个指向下一个结构的指针:

typedef struct A {
  int a;
  int b;
  A*  next;
} A;

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

4

7 回答 7

78

您可以先在一个语句中定义 typedef 并前向声明该结构,然后在后续定义中定义该结构。

typedef struct A A;

struct A
{
    int a;
    int b;
    A* next;
};

编辑:正如其他人所提到的,如果没有前向声明,结构名称在结构定义中仍然有效(即您可以使用struct A),但 typedef 直到 typedef 定义完成后才可用(因此 using justA无效)。这对于只有一个指针成员可能无关紧要,但如果您有一个包含大量自类型指针的复杂数据结构,则可能不太实用。

于 2009-02-03T08:43:50.087 回答
65

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

struct A 
{ 
    int a; 
    int b; 
    struct A *next; 
};
于 2009-02-03T08:45:40.363 回答
21

你错过了struct之前的A*

  typedef struct A {
    int a;
    int b;
    struct A* next;
  } A;
于 2009-02-03T08:48:02.417 回答
14

您可以不使用前向声明:

struct A {
    int a;
    int b;
    struct A *next;
};
于 2009-02-03T08:46:56.740 回答
9

请,您使用的是 C,而不是 C++。

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

typedef struct _A {
    int a;
    int b;
    struct _A *next;
} A;

清楚地区分_A(在struct命名空间中)和A(在类型命名空间中)。

¹typedef隐藏了它所指向的类型的大小和存储——论点(我同意)是,在像 C 这样的低级语言中,试图隐藏任何东西都是有害的并且适得其反。习惯于随便struct A打字struct A

于 2009-02-03T21:34:12.340 回答
0
typedef struct {
 values
} NAME;

这是 typedef 结构的较短方法,我认为它是最简单的表示法,只是不要将名称放在前面而是放在后面。

然后你可以这样称呼它

NAME n;  

NAME *n; // if you'd like a ptr to it.

这种方法有什么问题吗?

于 2016-12-14T10:49:34.240 回答
0

使用以下预处理器:

#define structdef(NAME) typedef struct NAME NAME; struct NAME 

用法:

structdef(node_t)
{
   void* value;
   node_t* next;
};
于 2019-01-21T07:10:20.267 回答