Pregunta

Esto 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 ? Tales 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.

¿Fue útil?

Solución

Como señaló Douglas Mayle, básicamente denota un nombre de tipo. En consecuencia, sería desaconsejable poner fin a los nombres de variables o funciones con ' _t ' ya que podría causar cierta confusión. Además de 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 , y así sucesivamente. Estos nuevos tipos se definen formalmente en < stdint.h > pero la mayoría de las veces usará < inttypes.h > que (inusualmente para encabezados C estándar) incluye < stdint.h > . También ( < inttypes.h > ) también define macros para usar con printf () y scanf () .

Como señaló Matt Curtis, el compilador no tiene importancia en el sufijo; es una convención orientada a los humanos.

Sin embargo, también debe tener en cuenta que POSIX define muchos tipos de nombres 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, los sistemas nos hacen tropezar definiendo tipos con el mismo nombre que nosotros definimos.

Otros consejos

Es una convención utilizada para nombrar tipos de datos, por ejemplo, con typedef :


typedef struct {
  char* model;
  int year;
...
} car_t;

El _t generalmente envuelve una definición de tipo opaco.

GCC simplemente agrega los nombres que terminan con _t al espacio de nombres reservado que puede no usar, para evitar conflictos con futuras versiones de Standard C y POSIX (manual de la biblioteca GNU C) . Después de algunas investigaciones, finalmente encontré la referencia correcta dentro del estándar POSIX (1003.1, Justificación (informativa)):

  

B.2.12 Tipos de datos

     

El requisito de que los tipos adicionales definidos en esta sección terminen en & # 8216; & # 8216; _t & # 8217; & # 8217; fue impulsado por el   Problema de nombre de la contaminación del espacio. Es difícil definir un tipo (donde ese tipo no es uno   definido por IEEE Std 1003.1-2001) 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, todos   se requieren aplicaciones de conformidad para evitar que los símbolos terminen en & # 8216; & # 8216; _t & # 8217; & # 8217 ;, lo que permite la   implementador para proporcionar tipos adicionales. Debido a que un uso importante de los tipos está en la definición de   miembros de estructura, que pueden (y en muchos casos deben) agregarse a las estructuras definidas en   IEEE Std 1003.1-2001, la necesidad de tipos adicionales es convincente.

En pocas palabras, el Estándar dice que hay muchas posibilidades de extender la lista de tipos Estándar, por lo tanto, el Estándar restringe el espacio de nombres _t 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 nuevo tipo definido foo_t . Su programa no coincide con la nueva versión, lo que podría ser un problema. Restringir el uso de _t evita la refactorización del código. Por lo tanto, si su objetivo es cumplir con POSIX, definitivamente debe evitar el _t como lo indica la Norma.

Nota al margen: personalmente, trato de mantener POSIX porque creo que proporciona buenos conceptos básicos para una programación limpia. Además, me encantan las directrices Linux Coding Style (capítulo 5) . Hay algunas buenas razones para no usar typedef. Espero que esta ayuda!

Es una convención de nomenclatura estándar para tipos de datos, generalmente definida por typedefs. Una gran cantidad de código C que trata con 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.

El _t no tiene inherentemente ningún significado especial. Pero ha sido de uso común agregar el sufijo _t 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 ap en la parte delantera para un puntero y usar un guión bajo frente a las variables globales (esto es un poco menos común), y para usar los nombres de variable i , j y k para las variables de bucle temporales.

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 de int varía según las plataformas. ¿De qué int se está ajustando? (Aunque, en estos días, la mayoría de los desarrollos centrados en PC lo tratan como de 32 bits, muchas cosas para el desarrollo que no son para PC aún se tratan como de 16 bits).

Es solo una convención que significa " tipo " ;. No significa nada especial para el compilador.

Significa tipo. size_t es el tipo de tamaño.

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 establecer 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:

typedef unsigned long dc_uint32_t;

Si se trata de un código de interfaz de hardware, el autor del código que está viendo podría haber definido int_t como un entero de tamaño específico. El estándar C no asigna un tamaño específico al tipo int (depende de su compilador y plataforma de destino, potencialmente), y el uso de un tipo específico int_t evitaría que problema de portabilidad.

Esta es una consideración particularmente importante para el código de interfaz de hardware, que puede ser la razón por la que notó por primera vez la convención allí.

Por ejemplo en C99, /usr/include/stdint.h:

typedef unsigned char           uint8_t;
typedef unsigned short int      uint16_t;
#ifndef __uint32_t_defined
typedef unsigned int            uint32_t;
# define __uint32_t_defined
#endif
#if __WORDSIZE == 64
typedef unsigned long int       uint64_t;
#else
__extension__
typedef unsigned long long int  uint64_t;
#endif

_t siempre significa definido por typedef.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top