Per favore, non usare cose come "vps_t".
È un errore usare typedef per strutture e puntatori. Quando vedi a
vps_t a;
nella fonte, cosa significa?
Al contrario, se dice
struct virtual_container *a;
puoi effettivamente dire cos'è "a".
Molte persone pensano che dattilografia "aiuti la leggibilità". Non così. Sono utili solo per:
(a) oggetti totalmente opachi (dove il typedef è attivamente usato per nascondersi ciò che l'oggetto è).
Esempio: "pte_t" ecc. Oggetti opachi a cui è possibile accedere solo utilizzando le funzioni di accesso appropriate.
NOTA! Opacità e "funzioni accessorie" non sono buone in se stesse. Il motivo per cui li abbiamo per cose come pte_t ecc. È che ci sono davvero zero informazioni accessibili in modo portabile lì.
(b) Cancella tipi interi, in cui l'astrazione aiuta a evitare confusione se è "int" o "lungo".
u8 / u16 / u32 sono dattiloscritti perfettamente fini, sebbene rientrino nella categoria (d) meglio di qui.
NOTA! Ancora una volta - ci deve essere una ragione per questo. Se qualcosa è "unsigned long", non c'è motivo di farlo
typedef unsigned long myflags_t;
ma se c'è una chiara ragione per cui in determinate circostanze potrebbe essere un "unsigned int" e in altre configurazioni potrebbe essere "unsigned long", allora vai avanti e usa un typedef.
(c) quando si usa sparse per creare letteralmente un nuovo tipo per il controllo del tipo.
(d) Nuovi tipi identici ai tipi C99 standard, in determinate circostanze eccezionali.
Anche se ci vorrebbe solo una breve quantità di tempo per abituare gli occhi e il cervello ai tipi standard come 'uint32_t', alcune persone si oppongono comunque al loro uso.
Pertanto, sono consentiti i tipi "u8 / u16 / u32 / u64" specifici di Linux e i loro equivalenti firmati che sono identici ai tipi standard, sebbene non siano obbligatori nel nuovo codice personale.
Quando si modifica il codice esistente che utilizza già l'uno o l'altro set di tipi, è necessario conformarsi alle scelte esistenti in quel codice.
(e) Tipi sicuri per l'uso nello spazio utente.
In alcune strutture che sono visibili allo spazio utente, non possiamo richiedere i tipi C99 e non possiamo usare il modulo 'u32' sopra. Pertanto, usiamo __u32 e tipi simili in tutte le strutture condivise con userspace.
Forse ci sono anche altri casi, ma la regola dovrebbe fondamentalmente essere quella di NON MAI MAI MAI usare un typedef a meno che non sia possibile abbinare chiaramente una di quelle regole.
In generale, un puntatore o una struttura che ha elementi a cui si può ragionevolmente accedere direttamente non dovrebbe mai essere un refuso.