Это объявление typedef
typedef struct sala local, *local;
struct sala {
int id;
int capacidade;
int liga[3];
};
недопустимо, поскольку имя local
объявляется дважды с разными значениями: первое - как псевдоним для типа struct sala
, а второе - как псевдоним для тип struct sala *
.
Это разница между первым и вторым объявлениями typedef. :)
Что касается размещения объявления typedef, то оно может быть помещено либо перед соответствующей структурой определение. вместе с определением структуры или после определения структуры.
Например
typedef struct A A;
struct A
{
int x;
};
или
typedef struct A
{
int x;
} A;
или
struct A
{
int x;
};
typedef struct A A;
Существенная разница между эти объявления заключаются в том, что если вы хотите обратиться к определенной структуре внутри ее определения, то во втором и третьем случаях вы должны использовать имя типа struct A
, поскольку имя определения типа A еще не было объявлено.
Для пример
typedef struct Node Node;
struct Node
{
int x;
Node *next;
};
но например
typedef struct Node
{
int x;
struct Node *next;
} Node;