Esta parece una pregunta simple, pero no puedo encontrarla con la búsqueda de Stack Overflow o Google. ¿Qué significa un tipo seguido de un _t
medio? 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.
c
naming-conventions
types
Kevin Griffin
fuente
fuente
int_t
define? Si siempre se define comoint
, no es útil; es mucho más claro usarloint
directamente. Si no siempre se define comoint
(por ejemplo, si podría serlong int
oshort int
), entonces es un nombre mal elegido y confuso.Respuestas:
Como señaló Douglas Mayle, básicamente denota un nombre de tipo. En consecuencia, sería desaconsejable terminar los nombres de variables o funciones con '
_t
' ya que podría causar cierta confusión. Así comosize_t
, las norma define C89wchar_t
,off_t
,ptrdiff_t
, y probablemente algunos otros que he olvidado. El estándar C99 define un montón de tipos adicionales, tales comouintptr_t
,intmax_t
,int8_t
,uint_least16_t
,uint_fast32_t
, y así sucesivamente. Estos nuevos tipos se definen formalmente,<stdint.h>
pero la mayoría de las veces se usará lo<inttypes.h>
que (inusualmente para los encabezados C estándar) incluye<stdint.h>
. También (<inttypes.h>
) define macros para usar conprintf()
yscanf()
.Como señaló Matt Curtis, no hay significado para el compilador en el sufijo; Es una convención orientada al ser humano.
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 tropezamos con sistemas que definen tipos con el mismo nombre que nosotros definimos.fuente
abbr_xxxxx_t
nombres de tipo. Sin dicho prefijo, puede quedar atrapado en cualquier momento. En general, los_t
tipos estandarizados usan todas las minúsculas (FILE
yDIR
son dos excepciones, dos veces: todas mayúsculas y no mayúsculas_t
), por lo que puede usarCamelCase_t
con seguridad moderada, con o sin las mayúsculas principales. El sistema en el que trabajo principalmente tiende a vivir peligrosamente y se usa de_t
todos modos, pero en ocasiones nos ha mordido. Tiendo a usarCamelCase
sin sufijo para mi propio trabajo; mis funciones suelen ser todas minúsculas.Es una convención utilizada para nombrar tipos de datos, por ejemplo, con
typedef
:fuente
Por lo
_t
general, envuelve una definición de tipo opaco.GCC simplemente agrega nombres que terminan
_t
en el 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 un poco de investigación, finalmente encontré la referencia correcta dentro del Estándar POSIX (1003.1, Justificación (Informativo)):En pocas palabras, el Estándar dice que hay buenas posibilidades de extender 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 Issues 6 y usted definió un tipo
foo_t
. POSIX 1003.1 Issues 7 finalmente se lanza con un tipo recién definidofoo_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 apunta a un cumplimiento POSIX, definitivamente debe evitarlo_t
como lo establece el Estándar.Nota al margen: personalmente, trato de mantenerme en POSIX porque creo que ofrece buenos conceptos básicos para una programación limpia. Además, soy bastante aficionado a las pautas de Linux Coding Style (capítulo 5) . Hay algunas buenas razones por las cuales no usar typedef. ¡Espero que esto ayude!
fuente
Es una convención de nomenclatura estándar para tipos de datos, generalmente definida por typedefs. Una gran cantidad de código C que se ocupa de registros de hardware utiliza nombres estándar definidos por C99 para tipos de datos de tamaño fijo con y sin signo. Como convención, estos nombres están en un archivo de encabezado estándar (stdint.h) y terminan con _t.
fuente
Es solo una convención que significa "tipo". No significa nada especial para el compilador.
fuente
El
_t
no tiene inherentemente ningún significado especial. Pero ha sido de uso común agregar el_t
sufijo a typedef's.Es posible que esté más familiarizado con las prácticas comunes de C para nombrar variables ... Esto es similar a cómo es común pegar una AP en el frente para un puntero y usar un guión bajo frente a las variables globales (esto es un poco menos común) y utilizar los nombres de las variables
i
,j
yk
para variables de bucle temporal.En el código donde el tamaño de las palabras y el orden son importantes, es muy común usar tipos definidos personalizados que son explícitos, como
BYTE
WORD
(normalmente 16 bits)DWORD
(32 bits).int_t
no es tan bueno, porque la definición deint
varía entre plataformas, entonces, ¿a quiénint
se está conformando? (Aunque, en la actualidad, la mayoría del desarrollo centrado en PC lo trata como 32 bits, muchas cosas para el desarrollo que no es para PC todavía tratan los int como 16 bits).fuente
Significa tipo.
size_t
es el tipo de tallafuente
Hubo algunas buenas explicaciones sobre el tema. Solo para agregar otra razón para redefinir los tipos:
En muchos proyectos integrados, todos los tipos se redefinen para indicar correctamente el tamaño dado a los tipos y para mejorar la portabilidad en diferentes plataformas (es decir, compiladores de tipos de hardware).
Otra razón será hacer que su código sea portátil en diferentes sistemas operativos y evitar colisiones con los tipos existentes en el sistema operativo que está integrando en su código. Para esto, generalmente se agrega un prefijo único (como sea posible).
Ejemplo:
fuente
Si está tratando con un código de interfaz de hardware, el autor del código que está viendo podría haber definido
int_t
un número entero de tamaño específico. El estándar C no asigna un tamaño específico alint
tipo (depende de su compilador y plataforma de destino, potencialmente), y el uso de unint_t
tipo específico evitaría ese problema de portabilidad.Esta es una consideración particularmente importante para el código de la interfaz de hardware, que puede ser la razón por la que primero ha notado la convención allí.
fuente
Por ejemplo en C99, /usr/include/stdint.h:
_t
siempre significa definido por typedef.fuente