Por favor, no use cosas como "vps_t".
Es un error usar typedef para estructuras y punteros. Cuando veas un
vps_t a;
en la fuente, ¿qué significa?
Por el contrario, si dice
struct virtual_container *a;
en realidad puedes decir qué es "a".
Mucha gente piensa que typedefs "ayuda a la legibilidad". No tan. Son útiles solo para:
(a) objetos totalmente opacos (donde typedef se usa activamente para ocultar lo que es el objeto).
Ejemplo: "pte_t", etc., objetos opacos a los que solo puede acceder utilizando las funciones de acceso adecuadas.
¡NOTA! La opacidad y las "funciones de acceso" no son buenas en sí mismas. La razón por la que los tenemos para cosas como pte_t etc es que realmente es absolutamente cero información de manera portátil puede acceder allí.
(b) Tipos enteros claros, donde la abstracción ayuda a evitar confusiones si es "int" o "largo".
u8 / u16 / u32 son tipos de letra perfectamente precisos, aunque encajan en la categoría (d) mejor que aquí.
¡NOTA! Nuevamente, debe haber una razón para esto. Si algo es "sin firmar por mucho tiempo", entonces no hay razón para hacerlo
typedef unsigned long myflags_t;
pero si hay una razón clara de por qué bajo ciertas circunstancias podría ser un "unsigned int" y bajo otras configuraciones podría ser "unsigned long", entonces, por supuesto, siga adelante y use typedef.
(c) cuando usa disperso para crear literalmente un nuevo tipo para la verificación de tipo.
(d) Nuevos tipos que son idénticos a los tipos C99 estándar, en ciertas circunstancias excepcionales.
Aunque solo tomaría poco tiempo para que los ojos y el cerebro se acostumbren a los tipos estándar como 'uint32_t', algunas personas se oponen a su uso de todos modos.
Por lo tanto, los tipos específicos de Linux 'u8 / u16 / u32 / u64' y sus equivalentes firmados que son idénticos a los tipos estándar están permitidos, aunque no son obligatorios en el nuevo código propio.
Al editar el código existente que ya usa uno u otro conjunto de tipos, debe ajustarse a las opciones existentes en ese código.
(e) Tipos seguros para usar en el espacio de usuario.
En ciertas estructuras que son visibles para el espacio de usuario, no podemos requerir tipos C99 y no podemos usar el formulario 'u32' anterior. Por lo tanto, usamos __u32 y tipos similares en todas las estructuras que se comparten con el espacio de usuario.
Tal vez también haya otros casos, pero la regla debería ser NUNCA utilizar un typedef a menos que pueda coincidir claramente con una de esas reglas.
En general, un puntero o una estructura que tenga elementos a los que se pueda acceder directamente de manera razonable nunca debe ser un typedef.