Пожалуйста, не используйте такие вещи, как "vps_t".
Это ошибка использовать typedef для структур и указателей. Когда вы видите
vps_t a;
в источнике, что это значит?
Напротив, если он говорит
struct virtual_container *a;
Вы действительно можете сказать, что такое "а".
Многие думают, что typedefs "помогают читабельности". Не так. Они полезны только для:
(a) полностью непрозрачные объекты (где typedef активно используется, чтобы скрыть , что это за объект).
Пример: "pte_t" и т. Д. Непрозрачные объекты, доступ к которым можно получить только с помощью соответствующих функций доступа.
ВНИМАНИЕ! Непрозрачность и «функции доступа» сами по себе не годятся. Причина, по которой мы их используем для таких вещей, как pte_t и т. Д., Заключается в том, что на самом деле там абсолютно ноль портативно доступной информации.
(b) Очистить целочисленные типы, где абстракция помогает избежать путаницы, будь то "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.