Saltar al contenido

c – definiciones de estructura vs estructura de typedef

octubre 20, 2021
apple touch icon@2

Veo que es necesario hacer algunas aclaraciones sobre esto. C y C ++ no definen tipos de manera diferente. C ++ originalmente no era más que un conjunto adicional de inclusiones además de C.

El problema que prácticamente todos los desarrolladores de C / C ++ tienen hoy en día es a) las universidades ya no enseñan los fundamentos yb) la gente no comprende la diferencia entre una definición y una declaración.

La única razón por la que existen tales declaraciones y definiciones es para que el vinculador pueda calcular las compensaciones de direcciones en los campos de la estructura. Esta es la razón por la que la mayoría de la gente se sale con la suya con un código que en realidad está escrito incorrectamente, porque el compilador puede determinar el direccionamiento. El problema surge cuando alguien intenta hacer algo por adelantado, como una cola, una lista enlazada o una estructura de O / S a cuestas.

Una declaración comienza con ‘struct’, una definición comienza con ‘typedef’.

Además, una estructura tiene una etiqueta de declaración directa y una etiqueta definida. La mayoría de la gente no sabe esto y usa la etiqueta de declaración de reenvío como etiqueta de definición.

Incorrecto:

struct myStruct
   {
   int field_1;
   ...
   };

Acaban de usar la declaración de reenvío para etiquetar la estructura, por lo que ahora el compilador lo sabe, pero no es un tipo definido real. El compilador puede calcular el direccionamiento, pero no es así como se pretendía usar, por razones que mostraré en un momento.

Las personas que usan esta forma de declaración, siempre deben poner ‘struct’ en prácticamente todas las referencias a ella, porque no es un tipo nuevo oficial.

En cambio, cualquier estructura que no haga referencia a sí misma, debe declararse y definirse solo de esta manera:

typedef struct
   {
   field_1;
   ...
   }myStruct;

Ahora es un tipo real, y cuando se usa puede usar at como ‘myStruct’ sin tener que anteponerlo con la palabra ‘struct’.

Si desea una variable de puntero a esa estructura, incluya una etiqueta secundaria:

typedef struct
   {
   field_1;
   ...
   }myStruct,*myStructP;

Ahora tiene una variable de puntero a esa estructura, personalizada para ella.

DECLARACIÓN ADELANTE

Ahora, aquí está lo elegante, cómo funciona la declaración hacia adelante. Si desea crear un tipo que se refiera a sí mismo, como una lista vinculada o un elemento de cola, debe usar una declaración de reenvío. El compilador no considera la estructura definida hasta que llega al punto y coma al final, por lo que simplemente se declara antes de ese punto.

typedef struct myStructElement
   {
   myStructElement*  nextSE;
   field_1;
   ...
   }myStruct;

Ahora, el compilador sabe que aunque todavía no sabe cuál es el tipo completo, aún puede hacer referencia a él usando la referencia directa.

Declare y escriba correctamente sus estructuras. De hecho, hay una razón.

close