Bitte verwenden Sie keine Dinge wie "vps_t".
Es ist ein Fehler , typedef für Strukturen und Zeiger zu verwenden. Wenn Sie eine sehen
vps_t a;
Was bedeutet es in der Quelle?
Im Gegensatz dazu, wenn es heißt
struct virtual_container *a;
Sie können tatsächlich sagen, was "a" ist.
Viele Leute denken, dass Typedefs "die Lesbarkeit verbessern". Nicht so. Sie sind nur nützlich für:
(a) völlig undurchsichtige Objekte (wobei das typedef aktiv verwendet wird, um zu verbergen, was das Objekt ist).
Beispiel: "pte_t" usw. undurchsichtige Objekte, auf die Sie nur mit den richtigen Zugriffsfunktionen zugreifen können.
HINWEIS! Undurchsichtigkeit und "Zugriffsfunktionen" sind an sich nicht gut. Der Grund, warum wir sie für Dinge wie pte_t usw. haben, ist, dass es dort wirklich absolut keine tragbaren Informationen gibt.
(b) Löschen Sie ganzzahlige Typen, wobei die Abstraktion dazu beiträgt , Verwirrung zu vermeiden, ob sie "int" oder "long" ist.
u8 / u16 / u32 sind vollkommen feine Typedefs, obwohl sie besser in Kategorie (d) passen als hier.
HINWEIS! Wieder - es muss einen Grund dafür geben. Wenn etwas "lange nicht signiert" ist, gibt es keinen Grund dazu
typedef unsigned long myflags_t;
Wenn es jedoch einen klaren Grund dafür gibt, warum es unter bestimmten Umständen ein "unsigned int" und unter anderen Konfigurationen ein "unsigned long" sein kann, dann verwenden Sie auf jeden Fall ein typedef.
(c) Wenn Sie mit sparse buchstäblich einen neuen Typ für die Typprüfung erstellen .
(d) Neue Typen, die unter bestimmten außergewöhnlichen Umständen mit Standard-C99-Typen identisch sind.
Obwohl es nur eine kurze Zeit dauern würde, bis sich Augen und Gehirn an die Standardtypen wie 'uint32_t' gewöhnt haben, lehnen manche Leute ihre Verwendung trotzdem ab.
Daher sind die Linux-spezifischen Typen 'u8 / u16 / u32 / u64' und ihre signierten Entsprechungen zulässig, die mit den Standardtypen identisch sind - obwohl sie in Ihrem eigenen neuen Code nicht obligatorisch sind.
Wenn Sie vorhandenen Code bearbeiten, der bereits den einen oder anderen Satz von Typen verwendet, sollten Sie die vorhandenen Auswahlmöglichkeiten in diesem Code einhalten.
(e) Typen, die für die Verwendung im Benutzerbereich sicher sind.
In bestimmten Strukturen, die für den Benutzerbereich sichtbar sind, können wir keine C99-Typen benötigen und das obige Formular 'u32' nicht verwenden. Daher verwenden wir __u32 und ähnliche Typen in allen Strukturen, die für den Benutzerbereich freigegeben sind.
Vielleicht gibt es auch andere Fälle, aber die Regel sollte grundsätzlich sein, NIEMALS ein typedef zu verwenden, es sei denn, Sie können einer dieser Regeln eindeutig entsprechen.
Im Allgemeinen sollte ein Zeiger oder eine Struktur mit Elementen, auf die vernünftigerweise direkt zugegriffen werden kann, niemals ein typedef sein.