Разъяснение на примере союзов в стандарте C11
Следующий пример приведен в стандарте C11, 6.5.2.3
Следующее не является допустимым фрагментом (потому что тип объединения не виден внутри функции f):
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);
}
Почему важно, чтобы тип объединения был виден функции f?
Прочитав соответствующий раздел пару раз, я не увидел ничего в содержании раздела, запрещающего это.