Suponiendo que quería decir:
typedef struct someobj
{
/* ... */
} someobj_t;
la diferencia en general es simplemente estilística; algunas personas prefieren seguir el nombre de estilo "viejo C" para las estructuras (donde tienes que poner la palabra clave struct
en cualquier momento que te refieras a ese tipo), otras como la forma más sintética de simplemente usar someobj_t
.
Mucha gente que utiliza el símbolo definido por typedef
lo siente más natural porque a menudo provienen de otros idiomas (por ejemplo, C++, C#, ...) donde no hay necesidad de la cosa struct
. En muchos casos incluso omiten el nombre struct
de la declaración y simplemente dejan el nombre typedef
.
El uso de esos dos símbolos es en general equivalente, pero hay algunas advertencias; en primer lugar, antes de que finalice el typedef
, la versión _t
no existe, por lo que no puede declarar punteros a la estructura dentro de sí utilizando el nombre _t
.
Luego, el typedef
"existe" solo durante la compilación; esto significa que el compilador y el depurador se referirán a su símbolo con el nombre no typedef
.Si utiliza un typedef
sin un nombre de estructura "real", cuando tiene que investigar errores con algunos compiladores/depuradores puede volverse loco porque no puede referirse a un nombre de estructura "real", ya que typedef
estructuras ed sin un nombre real en realidad son estructuras anónimas.
Esto puede ser especialmente problemático si tiene que exportar su estructura con MIDL y cosas por el estilo; ver this post por Raymond Chen para más detalles.
Por último, pero no menos importante, puede hacer declaraciones directas solo con el nombre de la estructura real; y si no tiene un nombre de estructura (pero solo el typedef
) no puede hacer declaraciones directas.
¿Echas de menos un 'typedef'? –
¿Estás seguro de que tienes la pregunta, verdad? 'someobj_t' es un objeto, no un tipo, es posible que haya omitido un solo' typedef' en su código. – Kos
la notación '_t', suponiendo que se refiera a un typedef, si solo fuera una convención para distinguir' struct someobj' y 'someobj' (asumiendo que este era el nombre del tipo definido) - esto es porque C tiene dos" espacios de nombres "diferentes para estos (struct y typedef), y presumiblemente esta convención ayuda a agregar semántica al código. –