Between the dawn of C (going back at least to 1974) and 1989, if two structures shared a Common Initial Sequence, the language unambiguously allowed code to use a pointer of one structure type to inspect CIS members of the other. In the C99 standard, that permission was restricted to cases where both structure types are part of a union type whose complete declaration was visible at the point where the CIS value is inspected; some people insist that because the authors of the 1989 meant to impose such a restriction it applies to C89 as well. In addition, some compiler writers insist that because the authors of the Standard only meant for that guarantee to apply to accesses made through lvalues of union type, they'll ignore the part of the Standard that says that a definition of a "complete union type" must be visible.
Implementations are allowed to provide guarantees beyond those required by the Standard. Because non-psychic people writing code prior to C99 had no reason to expect that they would need to include otherwise-unnecessary union declarations in order to exploit the CIS guarantees, and because a lot of code written from that era relies upon those guarantees despite a lack of such declarations, anyone wanting to write an implementation suitable for use with such code must support them whether or not the Standard requires such support. While there is no particularly good reason why updates to the header file shouldn't include a union type declaration, I'm not sure how many compilers would care about its presence or absence. The compilers I've seen either support the CIS guarantees even without a complete union type declaration visible, or dishonor the CIS guarantees (ignoring the Standard) even when the declaration is present.