Main menu:

Site search

Categories

septembre 2008
L M M J V S D
1234567
891011121314
15161718192021
22232425262728
2930  

Archive

C++ – Comprendre les structures

Bien souvent, on me demande d’expiquer la notation des structures telles que celle utilisées dans l’API Windows. Je sais, cela n’a rien à voir avec Linux sauf que Microsoft ayant tendance a rendre son code illisible parfois (ou disons plus compliqué pour le débutant), je vais tenter d’expliquer cette construction même si on d’éloigne un peu du C++ (les structures en C n’ayant que peu à voir avec celles du C++). Voici un exemple typique d’une structure en C:

typedef struct type1
{
  int i;
  char *c;
}var1, *var2;

Commençons par simplifier cette structure afin d’y voir plus clair:

struct type1
{
  int i;
  char *c;
};

Ceci définit une structure de type type1 contenant un entier i et un pointeur vers un caractère c. Ok, jusque là, c’est assez simple.

struct type1
{
  int i;
  char *c;
}var1;

Cette fois-ci nous avons défini une structure de type type1 et une variable var1 de type type1.

Si vous mettez le mot-clé typedef devant une variable, vous changez la déclaration de la variable en une déclaration de type. Le nom de ce qui devrait être le nom de la variable devient, à cause du typedef, un nom de type.

typedef int i;

i devient un type équivalent à un int.
Revenons-en à notre problème et voyons en quoi le typedef en modifie le sens.

typedef struct type1
{
  int i;
  char *c;
}var1;

Ceci déclare un type type1 et var1 qui est aussi un type mais équivalent à type1.

struct type1
{
  int i;
  char *c;
}var1, *var2;

Ici, on définit une structure de type type1, une variable de type type1 corespondant à la structure et une variable de type pointeur vers un type type1.
Ajoutons le typedef:

typedef struct type1
{
  int i;
  char *c;
}var1, *var2;

Avec le typedef, on en arrive finalement à notre structure telle que rencontrée fréquemment dans l’API Windows.
Cette structure, précédée de typedef, définit trois types. D’abord un type type1 et un type var1 qui sont équivalents. Ensuite on définit le type var2 comme étant un pointeur vers le type type1. Remarquez qu’on ne définit donc pas de variables mais bien trois types.

Comments

Comment from Alexandre
Time: 15 septembre 2009, 22 h 10 min

Bonjour.

Je ne comprends pas bien la différence entre var1 et type1.

Si je veux déclarer une structure dans mon main par exemple, je dois faire var1 ma_structure ou type1 ma_structure ?

Merci !

Comment from admin
Time: 16 septembre 2009, 8 h 44 min

Si la structure est déclarée de cette façon:
struct type1{

}var1;
var1 est une variable de type type1.
Si on utilise un typedef:
typedef struct type1{

}var1;
var1 devient un type équivalent à type1.
De là toute la difficulté. Je n’ai jamais compris pourquoi Microsoft utilisait ce genre de construction. Ca complique la lecture et à mon sens ce n’est pas nécessaire. En C++, une structure est équivalent à une classe. Il ne sert à rien de mettre un typedef devant une struct ou une classe.

J’espère que c’est plus clair.