C: указатель на структуру в определении структуры - PullRequest
47 голосов
/ 03 февраля 2009

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

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

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

Ответы [ 7 ]

67 голосов
/ 03 февраля 2009

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

typedef struct A A;

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

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

58 голосов
/ 03 февраля 2009

В дополнение к первому ответу, без typedef и forward-декларации, это тоже подойдет.

struct A 
{ 
    int a; 
    int b; 
    struct A *next; 
};
17 голосов
/ 03 февраля 2009

Вы пропускаете struct до A*

  typedef struct A {
    int a;
    int b;
    struct A* next;
  } A;
13 голосов
/ 03 февраля 2009

Вы можете пойти без предварительной декларации:

struct A {
    int a;
    int b;
    struct A *next;
};
8 голосов
/ 04 февраля 2009

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

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

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

для четкого различия между _A (в пространстве имен struct) и A (в пространстве имен типов).

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

0 голосов
/ 21 января 2019

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

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

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

structdef(node_t)
{
   void* value;
   node_t* next;
};
0 голосов
/ 14 декабря 2016
typedef struct {
 values
} NAME;

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

Вы можете назвать это как

NAME n;  

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...