mardi 10 juillet 2012

[C/C++] [Astuce] Initialiser un struct

Salut à tous!
Je poste ici un petit mot concernant une astuce que j'ai trouvé, et qui mérite d'être vue: les Designated Initializers.

J'ai trop souvent vu des choses comme ceci :
typedef struct {
 int x;
 int y;
}point;

point pt;
pt.x = 7;
pt.y = 6;
Alors qu'il existe une méthode qui simplifie la chose en C89, et une autre méthode qui est plus pratique à mes yeux en C99.
typedef struct {
 int x;
 int y;
}point;

point pt = {5, 2};
point pt2 = {.x = 5, .y = 2};
Cela raccourcit peut-être qu'un tout petit peu le code qui sert d'exemple, mais par exemple dans un de mes projets, j'ai à peu près 8-10 membres d'une structure, et un autre 20!

Ceci ne marche que lors de l'initialisation!
Ça ne marchera pas après! Cela provoquera une erreur de compilation, faites attention!
typedef struct {
 int x;
 int y;
}point;

point pt;
pt = {5,2}; // NE MARCHERA PAS!
pt = {.x = 5, .y = 2}; // NE MARCHERA PAS NON PLUS!
La grande différence entre ces deux méthodes est capitale: celle du C89 initialise les variables dans l'ordre auquel on lui donne:
typedef struct {
 int x;
 int y;
}point;

point pt = {5, 2};
Ici, pt aura un membre x qui est égal à 5, et y à 2 alors que
typedef struct {
 int y;
 int x;
}point;

point pt = {5, 2};
Ici, ce sera l'inverse: y sera égal à 5 et x égal à 2.

Faites très attention quand vous modifiez/utilisez des structures, car seule la version C99 est indépendante de la disposition de la structure! Voilà, j'espère que cela vous servira beaucoup pour éclaircir et réduire le code source de vos projets! ;)

1 commentaire: