C: указатель на структуру в определении структуры

Как я могу указать указатель на следующую структуру в определении этой структуры:

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

вот как я впервые написал его, но он не работает.

Ответы

Ответ 1

Вы можете определить typedef и forward, объявив сначала структуру в одном из операторов, а затем определите структуру в следующем определении.

typedef struct A A;

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

Редактирование: как уже упоминалось, без прямого объявления, имя структуры по-прежнему остается действительным внутри определения структуры (т.е. Вы можете использовать struct A), но typedef недоступен до тех пор, пока определение typedef не будет завершено (поэтому использование только A wouldn ' t). Это может не иметь особого значения только с одним указателем, но если у вас есть сложная структура данных с множеством указателей самонаведения, может быть менее правдоподобным.

Ответ 2

В дополнение к первому ответу, без объявления typedef и forward, это тоже должно быть хорошо.

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

Ответ 3

Вам не хватает struct перед A*

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

Ответ 4

Вы можете перейти без прямого объявления:

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

Ответ 5

Пожалуйста, вы на C, а не на С++.

Если вы действительно должны typedef структуры (и большинство программистов, с которыми я работаю, не будет¹), сделайте следующее:

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

чтобы четко различать _A (в пространстве имен struct) и A (в пространстве имен типов).

¹ typedef скрывает размер и хранение типа, на который он указывает, - аргумент (и я согласен) заключается в том, что на языке низкого уровня, таком как C, попытка скрыть что-либо вредно и контрпродуктивно. Используй struct A, когда вы имеете в виду struct A.

Ответ 6

typedef struct {
 values
} NAME;

Это более короткий способ typedef структуры, я думаю, что это самая легкая нотация, просто не ставьте имя infront, но позади.

вы можете вызвать его как

NAME n;  

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

Что-то не так с этим подходом?

Ответ 7

Используйте следующий препроцессор:

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

Использование:

structdef(node_t)
{
   void* value;
   node_t* next;
};