977Fermer979
Kevin KoflerLe 05/05/2010 à 14:24
Godzil (./975) :
Le "polymorphisme" est possible en C :
struct truc1
{
int bla
char blo;
} var1;

struct truc2
{
int bla;
char blo;
short blu;
} var2;



void func()
{
  struct truc1 *test;
  test = (struct truc1) var2;
  test->blo = 42;
  printf("var2 blo = %d\n", var2.blo);
}
est parfaitement valide.

Non. C'est une violation des règles d'aliasing. Cf. ISO C99 paragraphe 6.5 §7. En revanche:
struct truc1
{
int bla
char blo;
} var1;

struct truc2
{
struct truc1 super;
short blu;
} var2;

void func()
{
  struct truc1 *test;
  test = (struct truc1*) var2;
  test->blo = 42;
  printf("var2 blo = %d\n", var2.super.blo);
}

est conforme d'après 6.5 §7, 5ème énuméré.

Il me semble (à vérifier!) que la détection d'aliasing de GCC accepte aussi ton code (si tu rajoutes le * que tu as oublié), exactement pour permettre cette utilisation, mais ce n'est pas du C conforme au standard.