Чтобы прочитать статью на английском языке, установите флажок Английский. Вы также можете просматривать текст на английском языке во всплывающем окне, наводя указатель мыши на текст.
Перевод
Английский
Рекомендуем использовать Visual Studio 2017

Спецификатор 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 следующее объявление:

будет эквивалентно следующему:

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
Показ: