2009-09-14 29 views

Respuesta

18

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.

+0

no sé sobre los detalles del primer caso, gracias por señalar – chester89

+0

Buena explicación. Y también tenga en cuenta que, por primera vez, no puede ubicarlo en el ámbito del espacio de nombres. –

+0

"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. –

4

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; 
+1

OK, pero ¿qué pasa con la pregunta: ¿Por qué definiría una estructura de una manera en lugar de otra? –

+0

¿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. –

+0

Puede ser bueno editar para incluir el uso: x my_struct; my_struct.a = 'a'; my_struct.b = 1; – ThePosey

2

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.

+1

Solo en C++; en C, necesita 'struct unnamed_struct x;'. –

4

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.

2

Los dos hacen cosas diferentes:

struct { 
    char a; 
    int b; 
} x; 

declara una variable de tipo xstruct { 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.

Cuestiones relacionadas