Не стоит недооценивать Денниса Ричи. Каждый статически типизированный язык должен иметь способ создания абстрактного типа , который пользователь не сможет подделать. Для этого вам понадобится конструкция типа или конструкция объявления, которая является generative , т. Е. Каждый экземпляр конструкции генерирует новый тип, отличный от любого другого. Такая конструкция жизненно необходима, если вы хотите, чтобы чужие руки не попадали в ваши данные. (Для множества примеров см. Книгу Дэйва Хэнсона C Интерфейсы и реализации .)
Так что здесь значения p1
и p2
имеют разные типы, но одно и то же представление:
struct { float x, y } p1;
struct { float x, y } p2;
Зачем выбирать struct
, чтобы быть генеративным? Потому что это достаточно общее, чтобы позволить широкий спектр удобных представлений. union
немного натянуто, но я подозреваю, что это «сопутствующий дизайн»; в системе типов C union
ведет себя как можно большим списком struct
, что упрощает компилятор.
Кстати, «эквивалентность декларации» - это термин, который я никогда не слышал раньше. 25 лет назад были популярны такие термины, как «эквивалентность имени», «структурная эквивалентность» и «эквивалентность событий». Сегодня системы типов намного более формальны, и эквивалентность обычно определяется логическими правилами, а не неформальным английским языком. Когда полезно прибегнуть к неформальному английскому языку, я обычно нахожу, что идея «генеративности» обладает большей объяснительной силой, чем придумывание нового названия для правил эквивалентности каждого нового языка.