Typedef declaration
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 Определения типов
Ключевые слова
Смотрите также
|
Документация C++
для
typedef
объявления
|