coding - c style guide
¿Qué representa un tipo seguido de_t(guión bajo-t)? (10)
Esto 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
? Como
int_t anInt;
Lo veo mucho en 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 finalizar 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
, etc. Estos nuevos tipos se definen formalmente en <stdint.h>
pero la mayoría de las veces usará <inttypes.h>
que (inusualmente para encabezados de C estándar) incluye <stdint.h>
. También ( <inttypes.h>
) define macros para usar con el printf()
y scanf()
.
Como observó 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 nombres de tipo 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 definimos.
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 la asignación de nombres de variables ... Esto es similar a cómo es común pegar ap en el frente para un puntero y usar un guión bajo delante de variables globales (esto es un poco menos común) , y para usar los nombres de las variables i
, j
y k
para las variables de bucle temporales.
En el código donde el tamaño de la palabra y el ordenamiento son importantes, es muy común usar tipos definidos personalizados que sean 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 la plataforma. ¿De qué int
se está adaptando? (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 PC todavía tratan los int como de 16 bits).
El _t
normalmente 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 versiones futuras 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 problema de la contaminación del espacio de nombres provocó el requisito de que los tipos adicionales definidos en esta sección terminen en '''' _t ''''. 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, se requieren todas las aplicaciones conformes para evitar que los símbolos terminen en '''' _t '''', lo que le permite al implementador proporcionar tipos adicionales. Debido a que un uso importante de los tipos se encuentra en la definición de miembros de la 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 los problemas 6 de POSIX 1003.1 y usted definió un tipo foo_t
. POSIX 1003.1 Los problemas 7 se lanzan finalmente 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 que se refactorice el 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. Por otra parte, me encantan las pautas de estilo de codificación de Linux (capítulo 5) . Hay algunas buenas razones para no usar typedef. ¡Espero que esto ayude!
Es solo una convención que significa "tipo". No significa nada especial para el compilador.
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 los registros de hardware utiliza nombres estándar definidos por C99 para tipos de datos de tamaño fijo firmados y no firmados. Como convención, estos nombres están en un archivo de encabezado estándar (stdint.h) y terminan con _t.
Es una convención utilizada para nombrar tipos de datos, por ejemplo, con typedef
:
typedef struct {
char* model;
int year;
...
} car_t;
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;
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.
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
como un entero de tamaño específico. El estándar de 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 int
específico 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 notó la convención allí.
Significa tipo. size_t
es el tipo de tamaño.