Avertissement: Ce n'est pas une technique mais une réponse pratique. Voir les réponses pour les questions techniques. Cette réponse se lit opiniâtre et subjective, mais s'il vous plaît garder avec moi pendant que j'essaie d'expliquer l'image plus grande.
struct
est une drôle de bête, parce que les trucs que vous mettez entre la parenthèse fermante }
et le point-virgule ;
désigne le contenu à l'intérieur ou à l'avant de ces crochets. Je sais pourquoi, et grammaticalement, il est logique, mais personnellement, je trouve qu'il est très contre-intuitif que les accolades signifie généralement portée:
Contre-intuitive, exemples:
// 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;
Il y a tellement de belles choses qui peuvent mal se passer avec la dense syntaxe de l' struct
s et typedef
s s'utilise comme ceci. Comme indiqué ci-dessous, il est très facile de déclarer une variable au lieu d'un type par accident. Le compilateur est que de peu d'aide parce que presque toutes les combinaisons sont grammaticalement correctes. Ils ne sont pas nécessairement ce que vous essayez d'exprimer. C'est un abîme de désespoir.
Mauvais exemples:
// 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;
};
Pour des raisons de lisibilité et de la maintenance, je préfère déclarer tout séparément et ne jamais mettre quoi que ce soit derrière l'accolade fermante. Le coût de lignes de code supplémentaires sont facilement compensés par intuitive de la syntaxe. Je soutiens que cette approche rend plus facile pour faire les bonnes choses et ennuyeux à faire les mauvaises choses.
Intuitive exemples:
// 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;