Объявления Typedef
Объявление typedef — это объявление с typedef в качестве класса хранения. Декларатор становится новым типом. Объявления typedef можно использовать для создания более коротких или более значимых имен для типов, уже определенных C или для объявленных типов. Имена typedef позволяют инкапсулировать детали реализации, которые могут измениться.
Объявление typedef интерпретируется точно так же, как и объявление переменной или функции, но идентификатор становится синонимом типа, а не принимает тип, указанный в объявлении.
Синтаксис
declaration
:
declaration-specifiers
необ.init-declarator-list
;
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
необ.
type-specifier
declaration-specifiers
необ.
type-qualifier
declaration-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 разделяют пространство имен обычными идентификаторами. (Дополнительные сведения см. в разделе Name Spaces.) Таким образом, программа может иметь имя 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.
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 );