Namespaces
Variants

Typedef declaration

From cppreference.net

typedef declaration предоставляет способ объявить идентификатор как псевдоним типа, который будет использоваться для замены возможно сложного type name

Ключевое слово typedef используется в объявлении , в грамматической позиции спецификатора класса хранения , за исключением того, что оно не влияет на хранение или связывание:

typedef int int_t; // объявляет int_t псевдонимом для типа int
typedef char char_t, *char_p, (*fp)(void); // объявляет char_t псевдонимом для char
                                           // char_p псевдонимом для char*
                                           // fp псевдонимом для char(*)(void)

Содержание

Объяснение

Если объявление использует typedef как спецификатор класса хранения, каждый декларатор в нем определяет идентификатор как псевдоним указанного типа. Поскольку в объявлении допускается только один спецификатор класса хранения, объявление typedef не может быть static или extern .

Объявление typedef не вводит отдельный тип, оно лишь создаёт синоним для существующего типа, поэтому имена typedef совместимы с типами, которые они псевдонимизируют. Имена typedef разделяют пространство имён с обычными идентификаторами, такими как перечислители, переменные и функции.

Объявление typedef для VLA может находиться только в области видимости блока. Длина массива вычисляется каждый раз, когда поток управления проходит через объявление typedef, в отличие от объявления самого массива:

void copyt(int n)
{
    typedef int B[n]; // B is a VLA, its size is n, evaluated now
    n += 1;
    B a; // size of a is n from before +=1
    int b[n]; // a and b are different sizes
    for (int i = 1; i < n; i++)
        a[i-1] = b[i];
}
(since C99)

Примечания

typedef-имя может быть неполным типом , который может быть завершён обычным образом:

typedef int A[]; // A - это int[]
A a = {1, 2}, b = {3,4,5}; // тип a - int[2], тип b - int[3]

Объявления typedef часто используются для внедрения имён из пространства имён тегов name space в обычное пространство имён:

typedef struct tnode tnode; // tnode в обычном пространстве имён
                            // является псевдонимом для tnode в пространстве имён тегов
struct tnode {
    int count;
    tnode *left, *right; // то же самое, что struct tnode *left, *right;
}; // теперь tnode также является полным типом
tnode s, *sp; // то же самое, что struct tnode s, *sp;

Они могут даже полностью избежать использования пространства имен тегов:

typedef struct { double hi, lo; } range;
range z, *zp;

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

// массив из 5 указателей на функции, возвращающие указатели на массивы из 3 целых чисел
int (*(*callbacks[5])(void))[3];
// то же самое с использованием typedef
typedef int arr_t[3]; // arr_t - массив из 3 целых чисел
typedef arr_t* (*fp)(void); // указатель на функцию, возвращающую arr_t*
fp callbacks[5];

Библиотеки часто предоставляют системно-зависимые или конфигурационно-зависимые типы в виде определений typedef, чтобы обеспечить единообразный интерфейс для пользователей или других компонентов библиотеки:

#if defined(_LP64)
typedef int     wchar_t;
#else
typedef long    wchar_t;
#endif

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 6.7.8 Определения типов (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 6.7.8 Определения типов (стр.: TBD)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 6.7.8 Определения типов (стр: 137-138)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 6.7.7 Определения типов (стр: 123-124)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 3.5.6 Определения типов

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

typedef

Смотрите также

Документация C++ для typedef объявления