Спецификатор typedef
Объявление typedef вводит в программу имя, которое в своей области видимости становится синонимом для типа, заданного параметром объявление-типа в этом объявлении.
typedef type-declaration synonym;
Заметки
Объявления typedef можно использовать для создания более коротких или более понятных имен для типов, уже определенных в языке или объявленных пользователем. Имена typedef позволяют инкапсулировать детали реализации, которые могут измениться.
В отличие от объявлений class, struct, union и enum, объявления typedef вводят в программу не новые типы, а новые имена для уже существующих типов.
Имена typedef используют то же пространство имен, что и обычные идентификаторы. Поэтому в программе может присутствовать имя typedef и идентификатор с тем же именем в локальной области.
Дополнительные сведения см. в следующих разделах:
Пример
// typedef_specifier1.cpp
typedef char FlagType;
int main()
{
}
void myproc( int )
{
int FlagType;
}
При объявлении в локальной области идентификатора с тем же именем, что и имя typedef, или при объявлении члена структуры либо объединения в той же области или во внутренней области обязательно должен указываться спецификатор типа. Например:
typedef char FlagType;
const FlagType x;
Чтобы повторно использовать имя FlagType для идентификатора, члена структуры или члена объединения, необходимо указать тип:
const int FlagType; // Type specifier required
Недостаточно написать
const FlagType; // Incomplete specification
поскольку FlagType воспринимается как часть типа, а не как заново объявляемый идентификатор. Это объявление недопустимо, как и
int; // Illegal declaration
С помощью typedef можно объявить любой тип, включая типы указателей, функций и массивов. Имя typedef для типа указателя на структуру или объединение можно объявить до определения типа структуры или объединения, если только определение находится в той же области видимости, что и объявление.
Примеры
Одна из причин, по которым используются объявления typedef, заключается в том, чтобы сделать объявления более унифицированными и компактными. Например:
typedef char CHAR; // Character type.
typedef CHAR * PSTR; // Pointer to a string (char *).
PSTR strchr( PSTR source, CHAR target );
typedef unsigned long ulong;
ulong ul; // Equivalent to "unsigned long ul;"
Для того чтобы при помощи ключевого слова typedef определить основные и производные типы в одном и том же объявлении, деклараторы можно разделять запятыми. Например:
typedef char CHAR, *PSTR;
В следующем примере задан тип DRAWF для функции, не возвращающей никакого значения и принимающей два аргумента int.
typedef void DRAWF( int, int );
После выполнения приведенного выше оператора typedef следующее объявление:
DRAWF box;
будет эквивалентно следующему:
void box( int, int );
Ключевые слова typedef и struct часто объединяются, что позволяют объявлять и именовать пользовательские типы:
// typedef_specifier2.cpp
#include <stdio.h>
typedef struct mystructtag
{
int i;
double f;
} mystruct;
int main()
{
mystruct ms;
ms.i = 10;
ms.f = 0.99;
printf_s("%d %f\n", ms.i, ms.f);
}