Disclaimer: Questa non è una risposta tecnica ma pratica. Fare riferimento alle altre risposte per questioni tecniche. Questa risposta si legge supponente e soggettiva, ma ti prego di sopportarmi mentre cerco di spiegare il quadro generale.
struct
è una bestia strana, perché la roba si mette tra la parentesi di chiusura }
e il punto e virgola ;
si riferisce al contenuto all'interno o davanti a quelle staffe. Io so perché questo è, e grammaticalmente ha senso, ma personalmente lo trovo molto intuitivo come parentesi graffe di solito significa campo di applicazione:
esempi
intuitivo:
// declares a variable named `foo` of unnamed struct type.
struct {
int x, y;
} foo;
foo.x = 1;
// declares a type named `Foo` of unnamed struct type
struct {
int x, y;
} typedef Foo;
Foo foo2;
foo2.x = 2;
// declares a type named `Baz` of the struct named `Bar`
struct Bar {
int x, y;
} typedef Baz;
// note the 'struct' keyword to actually use the type 'Bar'
struct Bar bar;
bar.x = 3;
Baz baz;
baz.x = 4;
quindi non ci sono molte cose sottili che possono andare storte con la sintassi densa di struct
se typedef
se usato in questo modo. Come mostrato sotto è molto facile dichiarare una variabile invece di un tipo per caso. Il compilatore ha solo un aiuto limitato perché quasi tutte le combinazioni sono grammaticalmente corrette. Semplicemente non significano necessariamente ciò che provi ad esprimere. È un pit of despair.
esempi sbagliati:
// mixed up variable and type declaration
struct foo {
int x, y;
} Foo;
// declares a type 'foo' instead of a variable
typedef struct Foo {
int x, y;
} foo;
// useless typedef but compiles fine
typedef struct Foo {
int x, y;
};
// compiler error
typedef Foo struct {
int x, y;
};
Per ragioni di leggibilità e manutenzione preferisco dichiarare tutto separatamente e mai messo nulla dietro la parentesi graffa di chiusura. Il costo di linee aggiuntive di codice è facilmente superato dalla sintassi intuitiva. Io sostengo che questo approccio makes it easy to do the right things and annoying to do the wrong things.
esempi intuitivi:
// declares a struct named 'TVector2'
struct TVector2 {
float x, y;
};
// declares a type named 'Vector2' to get rid of the 'struct' keyword
// note that I really never use 'TVector2' afterwards
typedef struct TVector2 Vector2;
Vector2 v, w;
v.x = 0;
v.y = 1;
non dovrebbe sempre essere "typedef"? È un'estensione speciale per le strutture? –
Itaypk
@Itaypk Non solo le strutture, come puoi vedere dal tuo esempio di 'enum'. –
@Itaypk; No. Non è un'estensione. Vedi la modifica. – haccks