c++ - tipos - typedef struct en c
Si hago un `typedef` en C o C++, ¿cuándo debo agregar`_t` al final del tipo typedef''ed? (6)
¿Cuándo se debe usar use _t
? ¿Nunca? Está reservado por un estándar importante (POSIX) e incluso si no es ahora, su código podría ser usado algún día en un entorno POSIX, por lo que usar _t
es una mala idea.
Me gustaría decir que el uso excesivo de typedef
es malo en general. Si su tipo es una struct
, union
o enum
, use estas palabras clave cuando declare variables y su código sea más claro. El uso de typedef
se reserva mejor cuando se desea que el tipo subyacente sea invisible para propósitos de abstracción / encapsulación. Algunos buenos ejemplos del estándar C son size_t
, int32_t
, mbstate_t
y stdio FILE
.
Algunos de los peores abusos de typedef
son la API de Windows ( WORD
, DWORD
, INT
, LPSTR
, etc.) y glib ( gint
, gchar
, etc.). Hacer duplicados de los tipos C estándar con el mismo uso previsto es solo confuso y sirve para bloquear a los desarrolladores en su biblioteca / plataforma al contaminar todo el código con estos nombres de tipo no estándar.
Esta pregunta ya tiene una respuesta aquí:
- C ++ sufijo de tipo _t, _type o ninguna 4 respuestas
Estoy confundido, ¿cuándo debo agregar el _t
final a los tipos _t
?
Por ejemplo, debería hacer esto:
typedef struct image image_t;
o esto:
typedef struct image image;
¿Cuáles son las reglas generales?
Otro ejemplo, debo hacer esto:
typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type_t;
o esto:
typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type;
Por favor iluminame.
Gracias, Boda Cydo.
Elija buenos nombres para sus tipos, tal como debería con sus variables, funciones y cualquier otra cosa. Un buen nombre no tiene información redundante incrustada, lo que dificulta la lectura del código, por lo que nunca ayuda si tiene un buen nombre para empezar.
Por cierto: typedef image image;
no tiene ningún sentido, ya que simplemente hace que la imagen sea un typedef a sí mismo.
En POSIX, los nombres que terminan con _t
están reservados, por lo que si está apuntando a un sistema POSIX (por ejemplo, Linux), no debe terminar sus tipos con _t
.
Estoy usando el sufijo _t
para las enumeraciones y los tipos primitivos para distinguirlos de las variables. Los puse en espacios de nombres, por lo que no me importan las reservas.
Para justificarlo. Muy a menudo, el nombre de la variable es una alusión al tipo tipográfico. Como std::size_t size;
, array_t array
etc. He encontrado que es más fácil elegir un nombre decente para una variable, cuando el tipo contiene el sufijo _t
. También me recuerda que es una clase primitiva tipográfica, y no otra clase de bestias como, por ejemplo.
Personalmente desprecio la convención. Sin embargo, mientras seas consistente, realmente no importa.
Tenga en cuenta que (como lo indican otras respuestas aquí) si está codificando a algún otro estándar, como POSIX, debe verificar si está de acuerdo con ese estándar antes de usar dichos nombres.
Uso sufijos para aumentar la legibilidad: _t para typedef, y _e para enums desde 25/30 años ... a veces uso _st cuando typedef define una estructura.
Creo que es una buena práctica hacer que el código sea legible y estandarizado, ¡entonces me parece correcto usar sufijos! Además, hasta la fecha, no he encontrado ningún documento oficial de POSIX que indique que el sufijo _t está reservado.
El antiguo stdio.h contiene _t ... Ver: grep -i "_t;" stdio.h :) Creo que el estándar POSIX es "un poco" más joven que C!