2008-10-23 21 views
176

Parece una pregunta simple, pero no puedo encontrarla con la búsqueda de desbordamiento de pila o Google. ¿Qué significa un tipo seguido de un _t? Tal como¿Qué representa un tipo seguido de _t (guión bajo-t)?

int_t anInt; 

lo veo mucho en código C destinado a tratar en estrecha colaboración con el hardware, no puedo evitar pensar que están relacionados.

+1

¿Dónde se define 'int_t'? Si siempre se define como 'int', no es útil; es mucho más claro usar 'int' directamente. Si no siempre se define como 'int' (por ejemplo, si podría ser' long int' o 'short int'), entonces es un nombre mal elegido y confuso. –

Respuesta

143

Como señaló Douglas Mayle, básicamente denota un nombre de tipo. En consecuencia, sería desaconsejable que finalice 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 una gran cantidad de 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>. (<inttypes.h>) también define macros para usar con printf() y scanf().

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

Sin embargo, también debe tener en cuenta que POSIX define una gran cantidad de 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 (por más de 20 años); regularmente tropezamos con sistemas que definen tipos con el mismo nombre que definimos.

+2

parece razonable que el sistema operativo y las bibliotecas de tiempo de ejecución comunes definan tipos con nombres genéricos; pero, ¿los tipos de su empresa no deberían estar precedidos de un prefijo o algo así? – Toybuilder

+1

Sí, deberían. Lamentablemente, no estaba a cargo de la convención de nomenclatura en el momento en que se utilizó. Y la búsqueda y el reemplazo globales no son algo sancionado, aunque podría usarse para solucionar muchos problemas, incluso en una base de código monstruosa. –

+8

Utilizo _type en lugar de _t en mis typedefs precisamente para evitar eso. – CesarB

9

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

7

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

37

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

 

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

Si usted está tratando con código de interfaz de hardware, el autor del código que está viendo podría haber definido int_t estar 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 ese 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 primero ha notado la convención allí.

+1

esto no será una buena práctica, esperaría que uno definiera [u] int_ [32 16 8] _t para aclarar cuál es el tamaño que usted define. – Ilya

+1

Tiene toda la razón, "int_t" por sí solo le dice al programador que es un tipo definido por el usuario pero no lo que realmente es. –

15

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 usa nombres estándar definidos por C99 para tipos de datos de tamaño fijo con y sin firma. Como una convención, estos nombres están en un archivo de encabezado estándar (stdint.h) y terminan con _t.

8

El _t no tiene ningún significado especial. Pero ha caído en uso común agregar el sufijo _t a typedef's.

Puede que esté más familiarizado con las prácticas de C comunes para el nombramiento de variables ...Esto es similar a cómo es común colocar una p en el frente para un puntero, y usar un guión bajo delante de las variables globales (esto es un poco menos común), y usar los nombres de las variables i, j y k por temporadas variables de bucle

En código donde la palabra de tamaño y el pedido es importante, es muy común el uso de tipos definidos a medida que son explícitos, como BYTEWORD (normalmente de 16 bits) DWORD (32 bits).

int_t no es tan bueno, porque la definición de int varía según las plataformas, de modo que ¿con qué int se está conformando? (Aunque, en estos días, la mayoría del desarrollo centrado en PC lo trata como 32 bits, muchas cosas para el desarrollo que no es PC todavía tratan las int como 16 bits).

6

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 para 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; 
29

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

GCC simplemente agrega nombres que terminan con _t en el espacio de nombre reservado que no puede usar, para evitar conflictos con las versiones futuras de Standard C y POSIX (GNU C library manual). Después de algunas investigaciones, finalmente encontré la referencia correcta dentro del estándar POSIX (1003.1, la lógica (Informativo)): Tipos

B.2.12 datos

El requisito de que los tipos adicionales definidos en esta sección final en '' _t '' fue provocado por el problema de contaminación del espacio de nombre. 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 los símbolos al espacio de nombre del programa. Para permitir que los implementadores proporcionen sus propios tipos, se requieren todas las aplicaciones conformes con para evitar símbolos que terminan en '' _t '', lo que permite que el implementador proporcione tipos adicionales. Debido a que un uso principal de los tipos está en la definición de los 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, la norma dice que hay buenas posibilidades de ampliar la lista de los tipos estándar, por lo tanto, la norma 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 impide la refacturación del código. Por lo tanto, si desea obtener una conformidad POSIX, definitivamente debe evitar el _t como lo indica el Estándar.

Nota al margen: personalmente, intento atenerme a POSIX porque creo que da buenos elementos básicos para una programación limpia. Además, soy muy aficionado a las directrices Linux Coding Style (chapter 5). Hay algunas buenas razones para no usar typedef. ¡Espero que esto ayude!

Cuestiones relacionadas