Описания со спецификацией typedef задают идентификаторы, которыепозднее могут использоваться для обозначения основных илипроизводных типов. Спецификация typedef недопустима в определении-функции($$R.8.3). имя-typedef: идентификаторВ пределах области видимости ($$R.3.2) описания typedef любойидентификатор, появляющийся в части любого из описателей,становится синтаксически эквивалентным служебному слову и обозначает тип,связанный с данным идентификатором, как описано в $$R.8. Таким образом,имя-typedef является синонимом другого типа. В отличие от описаниякласса ($$R.9.1) имя-typedef не добавляет нового типа. Например,после описания typedef int MILES, *KLICKSP; конструкции MILES distance; extern KLICKSP metricp; являются законными описаниями, тип distance есть int, а у metricpтип "указатель на int". С помощью typedef можно переопределить имя так, чтобы оно опятьобозначало тип, на который уже ссылалось, причем даже в той областивидимости, в которой тип был первоначально описан, например, typedef struct s { /*... */ } s; typedef int I; typedef int I; typedef I I; Безымянный класс, который определяется в typedef, получает вкачестве своего имени имя, использованное в typedef, например, typedef struct { /*.... */ } S; // имя структуры стало S С помощью описания typedef нельзя переопределить имя типа,описанного в этой же области видимости, так, чтобы оно обозначалодругой тип, например, class complex { /*... */ }; typedef int complex; // ошибка: переопределение Аналогично, нельзя описывать класс с именем типа, описанногов этой же области видимости, так, чтобы он обозначал другойтип, например, typedef int complex; class complex { /*... */ }; // ошибка: переопределение Имя-typedef, которое обозначает класс, является именем-класса($$R.9.1). Синоним нельзя использовать после следующих префиксов:class, struct и union, а также в именах конструкторов идеструкторов в описании самого класса, например, struct S { S(); ~S(); }; typedef struct S T; S a = T(); // нормально struct T* p; // ошибка