Bonjour !
Patrick Dupre a écrit :
> Est-ce que en c il y a un moyen d'"etendre" une stucture deja definie en
> typedef ?
> Je voudrais reutiliser une structure en lui ajoutant une variable.
Tu peux toujours définir une nouvelle structure qui encapsule la
structure initiale :
struct initial {
int x;
int y;
};
struct extended {
struct initial b; /* encapsulate "base class" */
int z; /* add extra member */
};
Si tu mets la structure initiale au tout début de ta nouvelle structure,
tu as en plus la garantie que les deux commencent à la même adresse [1].
Ça veut dire que si une fonction de ta bibliothèque attend un pointeur
vers la structure initiale :
void do_some_stuff(struct initial *data);
Tu peux lui passer un pointeur vers la structure étendue:
struct extended my_struct = {.b = {.x = 1, .y = 2}, .z = 3};
do_some_stuff((struct initial *) &my_struct);
Depuis C11 tu peux aussi ne pas nommer la structure initiale :
struct extended {
struct initial; /* anonymous struct */
int z; /* extra member */
};
Dans ce cas tu accèdes à ses membres comme si c'étaient des membres de
ta structure étendue :
struct extended my_struct;
my_struct.x = 4;
...
Ici "my_struct.x" signifie en fait
"my_struct.<anonymous struct initial>.x".
Avec gcc tu as le droit à ça si tu compiles avec -std=c11 ou, si ton gcc
est trop ancien pour supporter ça (c'est le cas du mien), avec
-fms-extensions.
À+,
Edgar.
[1]
http://embeddedgurus.com/state-space/2008/01/object-based-programming-in-c/