struct {
char a;
int b;
} x;
¿Por qué uno definir una estructura como la que en vez de declarar como:¿Cuál es la diferencia entre declarar y definir una estructura?
struct x {
char a;
int b;
};
struct {
char a;
int b;
} x;
¿Por qué uno definir una estructura como la que en vez de declarar como:¿Cuál es la diferencia entre declarar y definir una estructura?
struct x {
char a;
int b;
};
En el primer caso, solo la variable x
puede ser de ese tipo; estrictamente, si definió otra estructura y
con el mismo cuerpo, sería un tipo diferente. Entonces lo usa cuando nunca necesitará otras variables del mismo tipo. Tenga en cuenta que no puede convertir cosas a ese tipo, declarar o definir funciones con prototipos que usan ese tipo, ni asignar dinámicamente variables de ese tipo; no hay ningún nombre para el tipo que se va a usar.
En el segundo caso, no define una variable; solo define un tipo struct x
, que luego puede usarse para crear tantas variables como necesite de ese tipo. Este es el caso más normal, por supuesto. A menudo se combina con, o asociada con, una typedef
:
typedef struct x
{
char a;
int b;
} x;
Por lo general, tendrá que utilizar un nombre de etiqueta y el nombre tipo más informativo. Es perfectamente legal y seguro usar el mismo nombre para la etiqueta de estructura (la primera "x") y el nombre de tipodef (la segunda "x").
A una primera aproximación, C++ automáticamente 'crea un typedef' para usted cuando utiliza el simple 'struct x {...};' notación (si define variables al mismo tiempo o no). Para obtener detalles bastante completos sobre las advertencias asociadas con el término "primera aproximación", vea los extensos comentarios a continuación. Gracias a todos los comentaristas que me ayudaron a aclararme esto.
En el primer caso que se está declarando una variable. En el segundo, un tipo. Creo que un mejor enfoque sería:
typedef struct tag_x {
char a;
int b;
} x;
OK, pero ¿qué pasa con la pregunta: ¿Por qué definiría una estructura de una manera en lugar de otra? –
¿Por qué usar 'tag_x' y' x' para referirse a lo mismo. Las etiquetas structure, union y enum están en un espacio de nombres separado del espacio de nombres de los identificadores ordinarios donde se definen typedefs, por lo que no hay conflicto, y C++ crea efectivamente 'typedef struct x {...} x;' automáticamente. –
Puede ser bueno editar para incluir el uso: x my_struct; my_struct.a = 'a'; my_struct.b = 1; – ThePosey
La primera es equivalente a
struct unnamed_struct { char a; int b;};
unnamed_struct x;
sólo que el tipo de estructura no tiene nombre.
Solo en C++; en C, necesita 'struct unnamed_struct x;'. –
La primera define una variable llamada 'x' cuyo tipo es una estructura sin nombre.
El segundo define una estructura llamada x, pero no define nada que la use.
Los dos hacen cosas diferentes:
struct {
char a;
int b;
} x;
declara una variable de tipo x
struct { char a; int b; }
struct x {
char a;
int b;
};
declara un tipo struct x
. Para obtener una variable de ese tipo, que más tarde se necesita hacer esto:
struct x x = {0};
x x = {0}; // C++ only
El segundo es más común, ya que puede hacer declaraciones más corto, especialmente si usted tiene que cambiar su estructura. El primero se usa si nunca va a necesitar la estructura nuevamente y no quiere contaminar su espacio de nombres. Así que, básicamente, nunca.
no sé sobre los detalles del primer caso, gracias por señalar – chester89
Buena explicación. Y también tenga en cuenta que, por primera vez, no puede ubicarlo en el ámbito del espacio de nombres. –
"C++ en efecto lo hace automáticamente cuando usa la estructura simple 'struct x {...};' notación "A menos que haya una función del mismo nombre visible, en cuyo caso C++ solo puede usar 'struct x' como typename, no x solo, exactamente lo mismo que C. –