Псевдонимы типов
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.