¿Qué representa un tipo seguido de _t (guión bajo-t)?
Esto parece una pregunta simple, pero no puedo encontrarla con la búsqueda de Stack Overflow o con Google. ¿ Qué significa un tipo seguido de una _t
media? Como
int_t anInt;
Lo veo mucho en el código C destinado a tratar estrechamente con el hardware; no puedo evitar pensar que están relacionados.
Como señaló Douglas Mayle, básicamente denota un nombre de tipo. En consecuencia, no sería aconsejable terminar los nombres de variables o funciones con ' _t
', ya que podría causar cierta confusión. Además size_t
, el estándar C89 define wchar_t
, off_t
, ptrdiff_t
y probablemente algunos otros que he olvidado. El estándar C99 define muchos tipos adicionales, como uintptr_t
, intmax_t
, int8_t
, uint_least16_t
, uint_fast32_t
etc. Estos nuevos tipos se definen formalmente en <stdint.h>
, pero la mayoría de las veces utilizará <inttypes.h>
el que (inusualmente para encabezados C estándar) incluye <stdint.h>
. ( <inttypes.h>
) también define macros para usar con printf()
y scanf()
.
Como señaló Matt Curtis, el sufijo no tiene ningún significado para el compilador; es una convención orientada a los humanos.
Sin embargo, también debe tener en cuenta que POSIX define muchos nombres de tipos adicionales que terminan en ' _t
' y reserva el sufijo para la implementación. Eso significa que si está trabajando en sistemas relacionados con POSIX, no es aconsejable definir sus propios nombres de tipo con la convención. El sistema en el que trabajo lo ha hecho (durante más de 20 años); Regularmente nos hacemos tropezar con sistemas que definen tipos con el mismo nombre que nosotros.
Por lo _t
general, envuelve una definición de tipo opaco.
GCC simplemente agrega nombres que terminan en _t
al espacio de nombres reservado que no puede usar, para evitar conflictos con versiones futuras de Standard C y POSIX (manual de la biblioteca GNU C) . Después de investigar un poco, finalmente encontré la referencia correcta dentro del Estándar POSIX 1003.1: B.2.12 Tipos de datos (Volumen: Justificación , Apéndice: B. Justificación de las interfaces del sistema , Capítulo: B.2 Información general ):
B.2.12 Tipos de datos
Tipos definidos
El requisito de que los tipos adicionales definidos en esta sección terminen en "_t" fue provocado por el problema de la contaminación del espacio de nombres. Es difícil definir un tipo (cuando ese tipo no esté definido por POSIX.1-2017) en un archivo de encabezado y usarlo en otro sin agregar símbolos al espacio de nombres del programa. Para permitir que los implementadores proporcionen sus propios tipos, todas las aplicaciones conformes deben evitar símbolos que terminen en "_t", lo que permite al implementador proporcionar tipos adicionales. Debido a que un uso importante de los tipos es la definición de miembros de estructura, que pueden (y en muchos casos deben) agregarse a las estructuras definidas en POSIX.1-2017, la necesidad de tipos adicionales es apremiante.
En pocas palabras, el Estándar dice que hay buenas posibilidades de ampliar la lista de tipos del Estándar, por lo tanto, el Estándar restringe el _t
espacio de nombres para su propio uso.
Por ejemplo, su programa coincide con POSIX 1003.1 Edición 7 y definió un tipo foo_t
. POSIX 1003.1 Edición 8 finalmente se lanza con un tipo recién definido foo_t
. Su programa no coincide con la nueva versión, lo que podría ser un problema. Restringir el _t
uso impide refactorizar el código. Por lo tanto, si su objetivo es cumplir con POSIX, definitivamente debe evitarlo, _t
como lo establece el Estándar.
Nota al margen: personalmente, trato de seguir con POSIX porque creo que ofrece buenos conceptos básicos para una programación limpia. Además, me gustan mucho las pautas de estilo de codificación de Linux (capítulo 5) . Hay algunas buenas razones por las que no utilizar typedef. ¡Espero que esto ayude!
Es una convención utilizada para nombrar tipos de datos, por ejemplo con typedef
:
typedef struct {
char* model;
int year;
...
} car_t;