Как я могу иметь указатель на следующую структуру в определении этой структуры:
typedef struct A {
int a;
int b;
A* next;
} A;
так я написал это вначале, но это не работает.
Как я могу иметь указатель на следующую структуру в определении этой структуры:
typedef struct A {
int a;
int b;
A* next;
} A;
так я написал это вначале, но это не работает.
Вы можете определить typedef и сначала объявить структуру в одном операторе, а затем определить структуру в последующем определении.
typedef struct A A;
struct A
{
int a;
int b;
A* next;
};
Изменить: как уже упоминалось, без предварительного объявления имя структуры все еще действует внутри определения структуры (т.е. вы можете использовать struct A
), но typedef недоступен до тех пор, пока определение typedef не будет завершено (поэтому использование только A
не быть действительным). Это может не иметь большого значения для всего лишь одного члена-указателя, но если у вас сложная структура данных с большим количеством указателей собственного типа, это может быть менее удобным.
A
определяет тип структуры в struct A
, а второй дает типу имя (псевдоним) A
. Если у вас было typedef int B;
, то int
- это тип, а B
- новое имя для типа. Таким же образом с typedef struct A A;
, struct A
- это тип, а A
- новое имя для типа.
- person Jonathan Leffler; 14.11.2019
В дополнение к первому ответу, без объявления typedef и forward, это тоже должно быть хорошо.
struct A
{
int a;
int b;
struct A *next;
};
Вам не хватает struct
перед A*
typedef struct A {
int a;
int b;
struct A* next;
} A;
Вы можете обойтись без форвардного объявления:
struct A {
int a;
int b;
struct A *next;
};
Пожалуйста, вы используете C, а не C ++.
Если вам действительно нужно typedef структуры (а большинство программистов, с которыми я работаю, не станут), сделайте следующее:
typedef struct _A {
int a;
int b;
struct _A *next;
} A;
чтобы четко различать _A
(в пространстве имен struct
) и A
(в пространстве имен типа).
¹typedef
скрывает размер и хранилище типа, на который указывает - аргумент (и я согласен) заключается в том, что на низкоуровневом языке, таком как C, попытки скрыть что-либо вредны и контрпродуктивны. Привыкайте набирать struct A
всякий раз, когда вы имеете в виду struct A
.
a = b
, неэффективны или не будут работать.
- person ephemient; 04.02.2009
_A
в struct _A
находится в пространстве имен «тег»; A
в конце typedef
находится в пространстве имен «обычные идентификаторы» (совместно с именами переменных, именами функций, именами типов и т. д.). Если существует пространство имен структуры, это означает набор имен членов структуры (и каждая структура или тип объединения имеет свое собственное пространство имен). См. C11 §6.2.3 Пространства имен идентификаторов.
- person Jonathan Leffler; 13.10.2018
__const
) в C?
- person Jonathan Leffler; 13.10.2018
typedef struct {
values
} NAME;
Это более короткий способ typedef структуры, я думаю, что это самая простая нотация, просто не помещайте имя спереди, а позади.
тогда вы можете назвать это как
NAME n;
NAME *n; // if you'd like a ptr to it.
Что-то не так с этим подходом?
Используйте следующий препроцессор:
#define structdef(NAME) typedef struct NAME NAME; struct NAME
Использование:
structdef(node_t)
{
void* value;
node_t* next;
};