La confusión se produce porque algunas de las declaraciones están, de hecho, declarando hasta tres construcciones C. Debe tener en cuenta la diferencia entre: 1. Una declaración typedef, 2. Una definición de estructura, y 3. Una declaración struct.
Son todas construcciones C muy diferentes. Todos hacen cosas diferentes; pero puedes combinarlos en una construcción compuesta, si quieres.
Miremos cada declaración por turno.
//================================================
struct foo {
short a;
int b;
float c;
};
Aquí estamos usando la sintaxis de definición de estructura más básica. Estamos definiendo foo como C tipo que luego puede usarse para declarar variables de ese tipo mediante la siguiente sintaxis:
foo myFoo; // Declare a struct variable of type foo.
// =============== =============================== Esta próxima declaración es un poco como la sintaxis anterior en ese declara un tipo C, pero usa la sintaxis typedef. Desglosémoslo en sus componentes usando la declaración básica anterior.
typedef foo bar; // Declare bar as a variable type, the alias of foo.
bar myBar; // This is ssemantically the same as: foo myBar;
Ahora simplemente reemplace el "foo" con la sintaxis anterior y ¡listo!
typedef struct {
short d;
int e;
float f;
} bar;
//==================================================================
typedef struct _baz {
short a;
int b;
float c;
} baz;
La sintaxis anterior es equivalente a la siguiente secuencia de declaraciones.
struct _baz {
short a;
int b;
float c;
}
typedef _baz baz; // Declare baz as an alias for _baz.
baz myBaz; // Is the same as: _baz myBaz;
//========================================================
Esto no responde su pregunta para C, pero creo que son todas correctas para C++, aunque se prefiere la primera. Esto también puede haber cambiado entre diferentes versiones de C, pero dejaré que alguien más hable de eso, ya que no soy un experto en la historia de C/C++. –
C++ es diferente: cuando escribes 'struct Foo {};' o 'clase Foo {};' allí, obtienes 'Foo' gratis sin' typedef'. –
Sin embargo, todos seguirán funcionando, aunque podrían hacer cosas ligeramente diferentes (como contaminar el espacio de nombres con etiquetas adicionales). –