Spec-Zone.ru › C

Объявление 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 Определения типов

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

typedef

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/typedef

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API