Por favor, não use coisas como "vps_t".
É um erro usar typedef para estruturas e ponteiros. Quando você vê um
vps_t a;
na fonte, o que isso significa?
Por outro lado, se diz
struct virtual_container *a;
você pode realmente dizer o que é "a".
Muitas pessoas pensam que os typedefs "ajudam na legibilidade". Não tão. Eles são úteis apenas para:
(a) objetos totalmente opacos (onde o typedef é usado ativamente para ocultar o que o objeto é).
Exemplo: "pte_t" etc. objetos opacos que você só pode acessar usando as funções adequadas do acessador.
NOTA! Opacidade e "funções de acessador" não são boas em si mesmas. A razão pela qual os temos para coisas como pte_t etc. é que realmente há zero informações de portabilidade acessíveis lá.
(b) Limpar tipos inteiros, nos quais a abstração ajuda a evitar confusão, seja "int" ou "long".
u8 / u16 / u32 são typedefs perfeitamente precisos, embora se encaixem na categoria (d) melhor do que aqui.
NOTA! Novamente - é preciso haver uma razão para isso. Se algo é "sem assinatura por muito tempo", não há razão para fazer
typedef unsigned long myflags_t;
mas se houver uma razão clara para que, em determinadas circunstâncias, possa ser um "int sem assinatura" e em outras configurações possa ser "sem assinatura por muito tempo", então, por todos os meios, vá em frente e use um typedef.
(c) quando você usa esparso para criar literalmente um novo tipo para verificação de tipo.
(d) Novos tipos idênticos aos tipos C99 padrão, em determinadas circunstâncias excepcionais.
Embora leve apenas um curto período de tempo para os olhos e o cérebro se acostumarem aos tipos padrão como 'uint32_t', algumas pessoas se opõem a seu uso de qualquer maneira.
Portanto, são permitidos os tipos 'u8 / u16 / u32 / u64' específicos do Linux e seus equivalentes assinados idênticos aos tipos padrão - embora não sejam obrigatórios no seu próprio código.
Ao editar o código existente que já usa um ou outro conjunto de tipos, você deve estar em conformidade com as opções existentes nesse código.
(e) Tipos seguros para uso no espaço do usuário.
Em certas estruturas visíveis ao espaço do usuário, não podemos exigir tipos C99 e não podemos usar o formulário 'u32' acima. Assim, usamos __u32 e tipos semelhantes em todas as estruturas que são compartilhadas com o espaço do usuário.
Talvez também existam outros casos, mas a regra deve ser basicamente NUNCA NUNCA use um typedef, a menos que você possa corresponder claramente a uma dessas regras.
Em geral, um ponteiro ou uma estrutura que possui elementos razoavelmente acessíveis diretamente nunca deve ser um typedef.