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.