2010-07-12 6 views
44

No estoy seguro de cuándo debo agregar el _t posterior a typedef 'ed tipos?Si hago un `typedef` en C o C++, ¿cuándo debería agregar` _t` al final del tipo typedef'ed?

Por ejemplo, debería hacer esto:

typedef struct image image_t; 

o esto:

typedef struct image image; 

¿Cuáles son las reglas generales?

Otro ejemplo, debería hacer esto:

typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type_t; 

o esto:

typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type; 

favor ilumíneme.

Gracias, Boda Cydo.

+23

Nunca. Los nombres de tipos que terminan en '_t' están reservados por algún estándar (no estoy seguro de cuál). Aunque hagas lo que hagas, no hagas '_type_t'. Elija '_type' o' _t' (u otra cosa), pero no los apile. Eso es tonto. –

+0

@Chris: ¿Puedes encontrar el estándar? Eso no es un problema en ANSI C o C++. –

+3

@Billy - Un poco de búsqueda y creo que es POSIX. Y desplazándose hacia abajo, James McNellis me ganó a esa. –

Respuesta

52

En POSIX, los nombres que terminan en _t están reservados, por lo que si está orientando un sistema POSIX (por ejemplo, Linux), no debe finalizar sus tipos con _t.

+5

Empíricamente, a menudo puede salirse con la suya por un tiempo prolongado, pero no tiene ningún regreso en nadie si realiza el acceso a una nueva plataforma o una nueva versión de una plataforma y encuentra conflictos. Entonces, es más seguro no usar el sufijo. –

+2

@Jonathan: Es cierto. Por supuesto, empíricamente, puede salirse con la suya con un montón de cosas :-P –

+1

La [CUPS API] (http://www.cups.org/documentation.php/doc-1.4/api-ppd.html) está plagada con tipos que terminan en '_t'; y se dirige a los sistemas POSIX, y es el sistema de impresión base para los Mac modernos. – dreamlax

17

Yo personalmente desprecio la convención _t. Mientras seas consistente, realmente no importa, sin embargo.

Tenga en cuenta que (como indican otras respuestas aquí) si está codificando a algún otro estándar, como POSIX, necesita comprobar si está correcto en ese estándar antes de utilizar dichos nombres.

0

Estoy usando _t sufijo para enumeraciones y tipos primitivos para distinguirlos de las variables. Los puse en espacios de nombres, por lo que no me importan las reservas _t.

Para justificarlo. Muy a menudo el nombre de variable es una alusión al tipo typedefed. Como std::size_t size;, array_t array etc. He encontrado que es más fácil elegir un nombre decente para una variable, cuando el tipo contiene _t sufijo. También me recuerda que es una primitiva de tipo de alimentación y no otra clase de bestia como, por ejemplo.

+1

'size_t size_t = 0;' es legal en C - declara una variable llamada 'size_t' del tipo' size_t'. El conflicto no importa entre tipos y variables. –

+5

Y luego la legibilidad del código va al espacio. Lo mismo aplica para 'size size = 0;'. – Spidey

+2

@Chris Lutz: ¿Has leído "distinguir de las variables"? – doc

0

Elija buenos nombres para sus tipos, justo como debería con sus variables, funciones y cualquier otra cosa. Un buen nombre no tiene incorporada información redundante que dificulte la lectura del código; nunca te ayuda si tienes un buen nombre para empezar.

Por cierto: typedef image image; no tiene ningún sentido, ya que solo hace que la imagen sea un tipo indecente.

+3

El ejemplo que usó fue 'typedef struct image image' que es útil en C. En C++, las variables' struct image' pueden declararse 'image x;' pero en C, tiene que declararlas 'struct image x;' Los programadores C usan lo anterior para simplificar la declaración 'struct' para los tipos comúnmente utilizados. –

+2

No escribió 'imagen de imagen typedef' - escribió' typedef struct image image'. Es común en C. – Chuck

+1

Es común incluso tipear una estructura sin nombre de esta manera. – Spidey

7

¿Cuándo se debe utilizar el uso _t? ¿Nunca? Está reservado por un estándar principal (POSIX) e incluso si no es así, su código podría ser usado algún día en un entorno POSIX, por lo que usar _t es una mala idea.

Iría más allá al decir que el uso excesivo de typedef es malo en general. Si su tipo es struct, union o enum, use estas palabras clave cuando declare las variables y haga que su código sea más claro. El uso de typedef se reserva mejor para cuando desea que el tipo subyacente sea invisible para fines de abstracción/encapsulación.Algunos ejemplos excelentes del estándar C son size_t, int32_t, mbstate_t, y el stdio FILE.

Algunos de los peores abusos de typedef son por la API de Windows (WORD, DWORD, INT, LPSTR etc.) y simplista (gint, gchar, etc.). Hacer duplicados de los tipos de C estándar con el mismo uso previsto solo es confuso y sirve para bloquear a los desarrolladores en su biblioteca/plataforma al contaminar todo el código con estos nombres de tipos no estándar.

+1

estuvo de acuerdo con la parte de la API de Windows, pero no es fácil, y para el caso de Qt también: cuando se admite una gran cantidad de plataformas, es necesario saber con qué tipos se trata, y un gint/qint podría tener diferentes subyacentes tipos. Además: nadie forzará a un desarrollador que use glib/Qt a usar estos tipos internos, ya que solo son 'typedef's, puede usar' int' en lugar de 'gint' (por supuesto, para su plataforma no exótica , ellos son lo mismo). – rubenvb

+8

A menos que pueda proporcionar evidencia real de la utilidad, afirmo que simplemente está equivocado. 'gint' no se define como cualquier tamaño particular de entero; es tan arbitrario como 'int'. Si las funciones API glib necesitan un tamaño particular, entonces deberían usar ese tipo: por ejemplo 'int32_t' si necesitan enteros de 32 bits o' size_t' si necesitan un tamaño de objeto o índice de matriz, etc. –

+0

Están reservados por estándar C biblioteca, en lugar de POSIX (por ejemplo, std :: size_t o std :: ptrdiff_t definido en cstddef). Esto no debería ser un problema, ya que hay espacios de nombres – doc

3

Uso los sufijos para aumentar la legibilidad: _t para typedef, y _e para enums desde 25/30 años ... a veces uso _st cuando typedef define una estructura.

Creo que es una buena práctica hacer que el código sea legible y estandarizado, ¡entonces me parece correcto usar sufijos! Además, hasta la fecha, no he encontrado ningún documento oficial de POSIX que indique que el sufijo _t está reservado.

Old stdio.h contiene _t ... Ver: grep -i "_t;" stdio.h :) ¡Creo que el estándar POSIX es "un poco" más joven que C!

+1

Esta respuesta menciona referencias dentro del estándar POSIX: http://stackoverflow.com/a/12727104/1404081 ("se requieren todas las aplicaciones compatibles para evitar símbolos que terminan en '' _t ''"). –

Cuestiones relacionadas