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;
};