Skip to the content.

Псевдонимы типов


typedef

Ключевое слово typedef позволяет создать псевдоним для любого типа данных и использовать его вместо фактического имени типа.

typedef double time_t;

// Эквивалентны:
double x;
time_t x;

Обычно к псевдонимам typedef добавляют окончание _t, указывая, таким образом, что идентификатором является тип, а не переменная.

typedef используется для улучшения разборчивости кода. Например:

int Test();

тип возврата int это хорошо, но что этот int означает? Исправим:

typedef int test_score_t;

test_score_t Test(); // возвращает результат теста

Также typedef позволяет запросто изменить тип объекта без внесения большого количества изменений. Например: у нас есть много функций, которые возвращают тип int, но мы решили что использовать тип float будет лучше, прийдется изменять кучу int на float. Однако, с использованием typedef достаточно просто изменить объявление:

typedef int studentID_t;   // Было
typedef float studentID_t; // Стало

Однако при этом не стоит забывать что изменяя текущий тип на тип из другого семейства (целые на плавающие) могут возникнуть проблемы с сравнениями, делениями.

На некоторых платформах int занимает 2 байта, на других - 4 байта. Таким образом, хранение в int более 2-х байтов может быть опасным для кросплатформернного кода. typedef очень часто используется в кросплатформенных программах для определения псевдонимов, которые включают размер типа в битах, например: int8_t, int16_t, int32_t.

Также используя typedef можно значительно упрощать сложные записи, например:

typedef std::vector<std::pair<std::string, int>> pairlist_t;

pairlist_t t;

bool hasAttr(pairlist_t pairlist)
{
    
}

type alias

В С++11 ввели новый улучшенный синтаксис для typedef, который имитирует способ объявления переменных - type alias. Новый синтаксис создаёт меньше проблем при использовании в сложных ситуациях, и рекомендуется использовать его.

// Эквивалентны:
typedef double time_t;
using time_t = double;

Стоит отметить, что этот using не имеет ничего общего с using-statement.