Problema: el siguiente fragmento de código se compila bien (donde ambos tipos de estructura están definidos):
typedef struct { int a; float b; } member_struct; typedef struct { int a; double b; member_struct c; } outside_struct; outside_struct my_struct_array[4];
Sin embargo, si se descarta el typedef de "outside_struct":
typedef struct { int a; float b; } member_struct; struct { int a; double b; member_struct c; } outside_struct; struct outside_struct my_struct_array[4];
Recibo el error: "array type has incomplete element type 'struct outside_struct'".
Y si también elimino el typedef de "member_struct", obtengo un error adicional: "field 'c' has incomplete type"
Pregunta: ¿Por qué sucede? ¿Es estrictamente necesario usar typedef aquí? En mi código, de lo contrario, nunca uso typedef para tipos de estructura, por lo que estoy buscando una forma de evitar eso, si es posible.
En esta declaración
struct { int a; double b; member_struct c; } outside_struct;
se declara el objeto outside_struct
de tipo estructura sin nombre. No se declara ninguna estructura con el nombre struct outside_struct
.
Entonces el compilador emite un error en esta declaración de una matriz
struct outside_struct my_struct_array[4];
porque en esta declaración se introduce el especificador de tipo struct outside_struct
que no está definido. Es decir, en esta declaración, el especificador de tipo struct outside_struct
es un tipo incompleto.
No puede declarar una matriz con un tipo de elemento incompleto.
En lugar de declarar el objeto outside_struct
de una estructura sin nombre, debe declarar una estructura con el mismo nombre de etiqueta que
struct outside_struct { int a; double b; member_struct c; };
Si suelta el typedef, debe agregar una etiqueta de estructura en su lugar: struct outside_struct { ... };
Typedef se utiliza para crear un nombre adicional (alias) para otro tipo de datos.
typedef int myInt; //=>equivalent to "int" myInt index = 0; //=>equivalent to "int index = 0;"
Es la misma lógica para struct.
typedef struct myStruct {} myStruct_t; //=> equivalent to "struct myStruct {};" myStruct_t myStructVariable; //=> equivalent to "struct myStruct myStructVariable;"
syntaxe = "typedef type newAlias;"
" myStruct{} " es un nuevo tipo que contiene todo el tipo que desea (int, char...)