Объявление typedef
Объявление typedef предоставляет способ объявления идентификатора как псевдонима типа, который используется для замены, возможно, сложного имени типа.
Ключевое слово typedef используется в объявлении, в грамматической позиции спецификатора класса хранения, за исключением того, что оно не влияет на хранение или связь:
typedef int int_t; // declares int_t to be an alias for the type int
typedef char char_t, *char_p, (*fp)(void); // declares char_t to be an alias for char
// char_p to be an alias for char*
// fp to be an alias for char(*)(void)Объяснение
Если в объявлении используется typedef в качестве спецификатора класса хранения, каждый спецификатор в нем определяет идентификатор как псевдоним указанного типа. Поскольку в объявлении разрешен только один спецификатор класса хранения, объявление typedef не может быть статическим или внешним.
Объявление typedef не вводит отдельный тип, а только устанавливает синоним для существующего типа, поэтому имена typedef совместимы с типами, которые они заменяют. Имена typedef разделяют пространство имен с обычными идентификаторами, такими как перечисления, переменные и функции.
| Объявление typedef для массива с переменной длиной может появляться только в блочном объеме. Длина массива вычисляется каждый раз, когда поток управления проходит через объявление 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];
} | (с C99) |
Примечания
Имя typedef может быть неполным типом, который может быть завершен обычным способом:
typedef int A[]; // A is int[]
A a = {1, 2}, b = {3,4,5}; // type of a is int[2], type of b is int[3]Объявления typedef часто используются для ввода имен из пространства имен тегов в обычное пространство имен:
typedef struct tnode tnode; // tnode in ordinary name space
// is an alias to tnode in tag name space
struct tnode {
int count;
tnode *left, *right; // same as struct tnode *left, *right;
}; // now tnode is also a complete type
tnode s, *sp; // same as struct tnode s, *sp;Они могут даже вообще избегать использования пространства имен тегов:
typedef struct { double hi, lo; } range;
range z, *zp;Имена typedef также обычно используются для упрощения синтаксиса сложных объявлений:
// array of 5 pointers to functions returning pointers to arrays of 3 ints int (*(*callbacks[5])(void))[3] // same with typedefs typedef int arr_t[3]; // arr_t is array of 3 int typedef arr_t* (*fp)(void); // pointer to function returning arr_t* fp callbacks[5];
Библиотеки часто представляют зависящие от системы или конфигурации типы как имена typedef, чтобы предоставить согласованный интерфейс для пользователей или для других компонентов библиотеки:
#if defined(_LP64) typedef int wchar_t; #else typedef long wchar_t; #endif
Ссылки
- Стандарт C23 (ISO/IEC 9899:2023):
- 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 объявлению |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/typedef