А Объявление typedef
Объявления, в которых спецификатор класса памяти есть typedef, не объявляют объектов - они определяют идентификаторы, представляющие собой имена типов. Эти идентификаторы называются typedef-именами.
typedef-имя: идентификатор
Объявление typedef приписывает тип каждому имени своего объявителя обычным способом (см. A8.6.). С этого момента typedef-имя синтаксически эквивалентно ключевому слову спецификатора типа, обозначающему связанный с ним тип. Например, после
typedef long Blockno, *Blockptr; typedef struct { double r, theta; } Complex;
допустимы следующие объявления:
Blockno b; extern Blockptr bp; Complex z, *zp;
b принадлежит типу long, bp — типу "указатель на long"; z — это структура заданного вида, a zp - принадлежит типу "указатель на такую структуру".
Объявление typedef не вводит новых типов, оно только дает имена типам, которые могли бы быть специфицированы и другим способом. Например, b имеет тот же тип, что и любой другой объект типа long.
typedef-имена могут быть перекрыты другими определениями во внутренней области видимости, но при условии, что в них присутствует указание типа. Например
extern Blockno;
не переобъявляет Blockno, а вот
extern int Blockno;
переобъявляет.