Le code suivant est un exemple de la C11 standard §6.5.2.3:C11 liées à la correction de la langue
struct t1 { int m; };
struct t2 { int m; };
int f(struct t1 *p1, struct t2 *p2)
{
if (p1->m < 0)
p2->m = -p2->m;
return p1->m;
}
int g()
{
union {
struct t1 s1;
struct t2 s2;
} u;
/* ... */
return f(&u.s1, &u.s2);
}
Comme par C11, la dernière ligne à l'intérieur g()
est invalide. Pourquoi ça?
Quelle est l'erreur réelle? – MrJLP
... et, tout à fait tangentiellement, je note que ce fragment définit 'g' comme' int g() 'plutôt que' int g (void) '. Cela devrait mettre au repos le canard que 'int main()' n'est pas approuvé par la norme - il n'y a pas de prototype pour 'g()', mais la définition de la fonction est valide. –
J'ai lu le problème car la fonction 'g' passe dans les deux champs de l'union à' f'. 'f' traite chaque paramètre comme une structure indépendante, sauf qu'ils proviennent réellement de la même union et donc de l'alias. – Brian