Итак ...
Point a tag
struct Point a type
typedef struct {
. . .
} Point_t;
Point_t a type
Я часто вижу почему? написано между строк. В конце концов, кажется вполне разумным просто сказать Point x;
, так почему вы не можете?
Как оказалось, ранние реализации C установили отдельное пространство имен для тегов и других идентификаторов. На самом деле 4 пространства имен 1 . После того, как язык был определен таким образом, стало невозможным использование тега struct в качестве типа, потому что тогда весь существующий код с конфликтами имен между обычными идентификаторами и тегами внезапно ошибиться.
1. 4 именных пространств :
- имена меток (устраняются неоднозначно по синтаксису объявления и использования меток);
- теги структур, объединений и перечислений (устраняющих неоднозначность, следуя любому) ключевых слов struct, union или enum);
- члены структур или союзов; каждая структура или союз имеет отдельное имя
пространство для его членов (неоднозначно по типу выражения, используемого для доступа к
член через. или -> оператор);
- все остальные идентификаторы, называемые обычными идентификаторами (объявленные в обычных деклараторах или как
константы перечисления)