Re: question de c

Page principale

Répondre à ce message
Auteur: Edgar Bonet
Date:  
À: guilde
Sujet: Re: question de c
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/