Код абсолютно допустим. C. Вы можете столкнуться с проблемами с отладчиками (ошибочно принять один тип за другой и попытаться отобразить один как другой), но это хорошо с языковой точки зрения.
Нет части стандарта, которая прямо говорила бы, что это законно.Скорее, в стандарте нет части, которая говорит, что она недопустима.
Нечто подобное было бы недопустимо в C ++, поскольку C ++ распространяет понятие linkage на классы и нелокально в C ++.классы всегда имеют внешнюю связь.