Объявления Typedef

Объявление typedef — это объявление с typedef в качестве класса хранения. Декларатор становится новым типом. Объявления typedef можно использовать для создания более коротких или более понятных имен для типов, уже определенных в C, или для объявленных типов. Имена typedef позволяют инкапсулировать детали реализации, которые могут измениться.

Объявление typedef интерпретируется точно так же, как и объявление переменной или функции, но идентификатор становится синонимом типа, а не принимает тип, указанный в объявлении.

Синтаксис

declaration:
declaration-specifiersinit-declarator-listнеоб.;

declaration-specifiers:
storage-class-specifierdeclaration-specifiersнеоб.
type-specifierdeclaration-specifiersнеоб.
type-qualifierdeclaration-specifiersнеоб.

storage-class-specifier:
typedef

type-specifier:
void
char
short
int
long
float
double
signed
unsigned
struct-or-union-specifier
enum-specifier
typedef-name

typedef-name:
identifier

Объявление typedef не создает новые типы. Оно создает синонимы для существующих типов или имена для типов, которые могут определяться другими способами. Если имя typedef используется как спецификатор типа, его можно использовать в сочетании с определенными спецификаторами типа (но нельзя использовать с другими спецификаторами). К допустимым модификаторам относятся const и volatile .

Имена typedef используют то же пространство имен, что и обычные идентификаторы. (Дополнительные сведения см. в разделе Пространства имен.) Таким образом, программа может иметь имя typedef и идентификатор локального область с тем же именем. Пример:

typedef char FlagType;

int main()
{
}

int myproc( int )
{
    int FlagType;
}

При объявлении идентификатора локального область с тем же именем, что и определение типа, или при объявлении члена структуры или объединения в том же область или во внутренней область, необходимо также указать описатель типа. Следующий пример иллюстрирует это ограничение:

typedef char FlagType;
const FlagType x;

Чтобы повторно использовать имя FlagType для идентификатора, члена структуры или члена объединения, необходимо указать тип:

const int FlagType;  /* Type specifier required */

Недостаточно сказать

const FlagType;      /* Incomplete specification */

поскольку FlagType воспринимается как часть типа, а не как заново объявляемый идентификатор. Это объявление недопустимо, как и

int;  /* Illegal declaration */

С помощью typedefможно объявить любой тип, включая типы указателя, функции и массива. Имя typedef для типа указателя на структуру или объединение можно объявить до определения типа структуры или объединения, если только определение находится в той же области видимости, что и объявление.

Имена typedef можно использовать, чтобы сделать код более понятным. Все три следующих объявления signal задают один и тот же тип, причем в первом объявлении имена typedef не используются.

typedef void fv( int ), (*pfv)( int );  /* typedef declarations */

void ( *signal( int, void (*) (int)) ) ( int );
fv *signal( int, fv * );   /* Uses typedef type */
pfv signal( int, pfv );    /* Uses typedef type */

Примеры

В следующих примерах показаны объявления typedef:

typedef int WHOLE; /* Declares WHOLE to be a synonym for int */

Например, теперь можно использовать в объявлении переменной, WHOLE такой как WHOLE i; или const WHOLE i;. Однако объявление long WHOLE i; недопустимо.

typedef struct club
{
    char name[30];
    int size, year;
} GROUP;

Этот оператор объявляет имя GROUP как тип структуры с тремя членами. Поскольку также указан тег структуры, club, в объявлениях можно использовать как имя typedef (GROUP), так и тег структуры. Необходимо использовать struct ключевое слово с тегом , а ключевое слово нельзя использовать struct с именем определения типа.

typedef GROUP *PG; /* Uses the previous typedef name
                      to declare a pointer            */

Тип PG объявлен как указатель на тип GROUP, который, в свою очередь, определен как тип структуры.

typedef void DRAWF( int, int );

В этом примере задан тип DRAWF для функции, не возвращающей никакого значения и принимающей два аргумента int. Это означает, например, что объявление

DRAWF box;

эквивалентно объявлению

void box( int, int );

См. также

Объявления и типы