ejemplos - estructuras anidadas lenguaje c
¿Cómo declarar una estructura en un encabezado que debe ser utilizado por varios archivos en c? (3)
Si tengo un archivo source.c con una estructura:
struct a {
int i;
struct b {
int j;
}
};
¿Cómo se puede usar esta estructura en otro archivo (es decir, func.c
)?
¿Debo crear un nuevo archivo de encabezado, declarar allí la estructura e incluir ese encabezado en func.c
?
¿O debería definir la estructura completa en un archivo de cabecera e incluir eso en source.c
y func.c
? ¿Cómo se puede declarar extern
la estructura en ambos archivos?
¿Debo typedef
? ¿Si es así, cómo?
si esta estructura va a ser utilizada por algún otro archivo func.c ¿cómo hacerlo?
Cuando se utiliza un tipo en un archivo (es decir, el archivo func.c), debe estar visible. La peor forma de hacerlo es copiar y pegarlo en cada archivo fuente que lo necesite.
La forma correcta es ponerlo en un archivo de encabezado e incluir este archivo de encabezado siempre que sea necesario.
¿debemos abrir un nuevo archivo de encabezado y declarar la estructura allí e incluir ese encabezado en el func.c?
Esta es la solución que más me gusta, porque hace que el código sea altamente modular. Yo codificaría tu estructura como:
#ifndef SOME_HEADER_GUARD_WITH_UNIQUE_NAME
#define SOME_HEADER_GUARD_WITH_UNIQUE_NAME
struct a
{
int i;
struct b
{
int j;
}
};
#endif
Yo pondría funciones usando esta estructura en el mismo encabezado (la función que es "semánticamente" parte de su "interfaz").
Y, por lo general, podría nombrar el archivo después del nombre de la estructura, y usar ese nombre nuevamente para elegir las guardias de encabezado definidas.
Si necesita declarar una función utilizando un puntero a la estructura, no necesitará la definición de estructura completa. Una simple declaración directa como:
struct a ;
Será suficiente, y disminuye el acoplamiento.
o podemos definir la estructura total en el archivo de encabezado e incluir eso en ambos source.c y func.c?
Esta es otra forma, algo más fácil, pero menos modular: algunos códigos que solo necesitan que su estructura funcione, deberían incluir todos los tipos.
En C ++, esto podría llevar a una complicación interesante, pero esto está fuera del tema (sin etiqueta C ++), así que no daré más detalles.
luego, cómo declarar esa estructura como extern en ambos archivos. ?
No entiendo el punto, tal vez, pero Greg Hewgill tiene una respuesta muy buena en su publicación ¿Cómo declarar una estructura en un encabezado que debe ser utilizada por varios archivos en c? .
¿Deberíamos escribirlo? ¿Entonces cómo?
- Si está usando C ++, no lo haga.
- Si estás usando C, deberías.
La razón es que la administración de C struct puede ser un problema: debe declarar la palabra clave struct en todos los lugares donde se usa:
struct MyStruct ; /* Forward declaration */
struct MyStruct
{
/* etc. */
} ;
void doSomething(struct MyStruct * p) /* parameter */
{
struct MyStruct a ; /* variable */
/* etc */
}
Mientras que un typedef te permitirá escribirlo sin la palabra clave struct.
struct MyStructTag ; /* Forward declaration */
typedef struct MyStructTag
{
/* etc. */
} MyStruct ;
void doSomething(MyStruct * p) /* parameter */
{
MyStruct a ; /* variable */
/* etc */
}
Es importante que aún conserves un nombre para la estructura. Escritura:
typedef struct
{
/* etc. */
} MyStruct ;
simplemente creará una estructura anónima con un nombre typedef-ed, y no podrá reenviar-declararlo. Por lo tanto, mantenga el siguiente formato:
typedef struct MyStructTag
{
/* etc. */
} MyStruct ;
Por lo tanto, podrá utilizar MyStruct en cualquier lugar que desee para evitar agregar la palabra clave struct, y aún usar MyStructTag cuando un typedef no funcione (es decir, declaración de envío)
Editar:
Se corrigió una suposición errónea sobre la declaración de la estructura C99, como ha señalado legítimamente Jonathan Leffler.
Para una definición de estructura que se utilizará en más de un archivo fuente, definitivamente debe ponerlo en un archivo de encabezado. Luego incluya ese archivo de encabezado en cualquier archivo fuente que necesite la estructura.
La declaración extern
no se usa para definiciones de estructura, sino que se usa para declaraciones de variables (es decir, algún valor de datos con un tipo de estructura que haya definido). Si desea utilizar la misma variable en más de un archivo fuente, declare como extern
en un archivo de encabezado como:
extern struct a myAValue;
Luego, en un archivo fuente, defina la variable real:
struct a myAValue;
Si olvida hacer esto o lo define accidentalmente en dos archivos fuente, el vinculador le informará al respecto.
ah:
#ifndef A_H
#define A_H
struct a {
int i;
struct b {
int j;
}
};
#endif
allí tienes, ahora solo necesitas incluir ah en los archivos donde quieras usar esta estructura.