Пожалуйста, не используйте такие вещи, как "vps_t".
Это ошибка использовать ЬурейеЕ для структур и указателей. Когда вы видите
vps_t a;
в источнике что это значит?
Напротив, если это говорит
struct virtual_container *a;
Вы действительно можете сказать, что такое «а».
Многие думают, что typedefs "помогает читабельности". Не так. Они полезны только для:
(а) полностью непрозрачные объекты (где typedef активно используется, чтобы скрыть, что это за объект).
Пример: "pte_t" и т. Д. Непрозрачные объекты, доступ к которым можно получить только с помощью соответствующих функций доступа.
НОТА! Непрозрачность и «функции доступа» сами по себе не годятся. Причина, по которой мы их используем для таких вещей, как pte_t и т. Д., Заключается в том, что в действительности там абсолютно нулевая доступная информация.
(б) Ясные целочисленные типы, где абстракция помогает избежать путаницы, является ли она «int» или «long».
u8 / u16 / u32 - отличные определения типов, хотя они вписываются в категорию (d) лучше, чем здесь.
НОТА! Опять же - должна быть причина для этого. Если что-то "unsigned long", то нет причин делать
typedef unsigned long myflags_t;
но если есть явная причина того, почему в определенных обстоятельствах это может быть «unsigned int», а в других конфигурациях может быть «unsigned long», тогда непременно продолжайте и используйте typedef.
(c) когда вы используете sparse для буквального создания нового типа для проверки типов.
(d) Новые типы, идентичные стандартным типам C99, в определенных исключительных обстоятельствах.
Хотя глазам и мозгу понадобится совсем немного времени, чтобы привыкнуть к стандартным типам, таким как 'uint32_t', некоторые люди все равно возражают против их использования.
Следовательно, специфичные для Linux типы «u8 / u16 / u32 / u64» и их подписанные эквиваленты, которые идентичны стандартным типам, разрешены, хотя они не являются обязательными в новом собственном коде.
При редактировании существующего кода, который уже использует тот или иной набор типов, вы должны соответствовать существующим вариантам в этом коде.
(e) Типы, безопасные для использования в пользовательском пространстве.
В некоторых структурах, которые видимы для пользовательского пространства, мы не можем требовать типов C99 и не можем использовать форму «u32» выше. Таким образом, мы используем __u32 и подобные типы во всех структурах, которые используются совместно с пользовательским пространством.
Может быть, есть и другие случаи, но правило должно быть НИКОГДА не использовать typedef, если вы не можете четко соответствовать одному из этих правил.
В общем случае указатель или структура, в которой есть элементы, к которым можно получить непосредственный доступ, никогда не должна быть typedef.