Спецификатор 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);
}
  10   0.990000

См. также

Ссылки

Ключевые слова в C++

Другие ресурсы

C++ Type Names