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