Я не думаю, что C принимает эквивалентность имени. ИМХО, C принимает структурную эквивалентность с исключениями для структур и союзов; для них используются имена. Это правда, что значения имеют тот же тип, который определяется именем их типа в эквивалентности имен, и что значения считаются такими же, как определено структурно эквивалентным в структурной эквивалентности. Но даже в структурной эквивалентности он не определяется независимо от названия.
По сути, атомарные типы в языке программирования имеют имена, и они используются как в эквивалентности имен, так и в структурной эквивалентности. Разница происходит от производных типов, таких как int *
или char[10]
. Это правда, что «примитивные типы имеют имена типов». И система типов C сравнивает структуру производных типов вплоть до определенных пользователем имен, исключая синонимы типов, даже если они определены пользователем с использованием typedef
.
Система типов
C, как правило, по структуре ... например, int *
и short *
- это разные типы, но int *
и int *
- это одни и те же типы. Причина того, что struct foo { int x; }
и struct bar { int x; }
- это разные типы, заключается в том, что они имеют разную структуру вплоть до определенных пользователем типов имен. Типы struct foo *
и struct foo *
являются одними и теми же типами, поскольку они находятся в одной структуре. Пожалуйста, не путайте, что struct
для структуры типов. Это просто для определения имен типов, точнее, структурных имен тегов в C.
Проще говоря, в структурной эквивалентности типы развертываются до атомарных имен типов и сравниваются. В C типы развертываются до имен, определенных пользователем. (Для развертывания, пожалуйста, обратитесь к http://www.csd.uwo.ca/~moreno//CS447/Lectures/TypeChecking.html/node3.html) В этом разница. Естественно, что имена, эквивалентные типам, структурно эквивалентны, но не наоборот.
Для следующего случая:
int x;
int y;
x
и y
и оба называют эквивалентными и структурными эквивалентами. Но в следующем случае:
int *x;
int *y;
x
и y
являются структурными эквивалентами, но не эквивалентны именам. Даже для следующего случая:
int *x, *y;
x
и y
не считаются эквивалентными в строгой схеме эквивалентности имен, поскольку это объявление рассматривается только как сокращение от предыдущего объявления. Ада - хорошо известный язык, принимающий строгую эквивалентность имен.