2011-09-07 18 views
5

tengo un rápido question..is Hay alguna diferencia en éstos:estructura anidada Sintaxis

struct myinnerstruct 
{ 
    int x; 

}; 

struct mystruct 
{ 
    struct myinnerstruct m; 
    int y; 
}; 

Y ESTA

struct mystruct 
{ 
    int x; 
    struct myinnerstruct 
    { 
     int y; 
    }; 
    struct myinnerstruct m; 
}; 

Estos tanto el trabajo por lo que yo puedo decir, pero estoy preguntándose si hay una razón para elegir una u otra. Gracias

+0

¿La segunda variante es incluso legal C? –

+0

No he podido encontrar ningún ejemplo en línea. Mis pruebas para ambos devuelven los mismos resultados. Así que AFAIK, lo es. – prelic

+0

Lo siguiente también funcionaría, para hacer que el segundo sea un poco más corto: 'struct mystruct {int x; struct myinnerstruct {int y; } m; }; En mi humilde opinión, la mejor razón para definir una 'struct' dentro de otra' struct' es cuando la 'struct' interna se utiliza exclusivamente y quizás repetidamente como miembro de la' struct' externa, es decir, cuando una 'struct' tiene que tener muchos "grupos" que almacenan información similar para diferentes propósitos. –

Respuesta

7

La diferencia es que el segundo no es válido.

Las cosas entre { y } en una declaración struct son una secuencia de declaraciones de miembros. Su

struct myinnerstruct 
    { 
     int y; 
    }; 

es una declaración de tipo; no declara un miembro de la estructura adjunta, por lo que es ilegal en ese contexto.

Lo que puede hacer es esto:

struct mystruct 
{ 
    int x; 
    struct myinnerstruct 
    { 
     int y; 
    } m; 
}; 

La declaración de m es una declaración de miembro, así que está bien; también declara el tipo struct myinnerstruct. Pero en mi opinión, es un estilo pobre. El tipo struct myinnerstruct permanece visible después de que se completa la declaración de struct mystruct; ver abajo para la explicación.

Si realmente quieres una estructura dentro de una estructura como esa, y no se va a utilizar struct myinnerstruct en otro sitio, usted podría dejarlo sin una etiqueta:

struct mystruct 
{ 
    int x; 
    struct 
    { 
     int y; 
    } m; 
}; 

Pero entonces puede ser que también declarar y como miembro de struct mystruct.

Si desea que struct innerstruct sea un tipo con nombre, simplemente explíquelo por separado, como lo hizo en su primer ejemplo.

Aquí está la explicación de por quéstruct innerstruct permanece visible.

El C99 standard (grande PDF), sección 6.2.1 párrafo 2, dice:

Para cada entidad diferente que designa un identificador, el identificador es visible (es decir, se puede utilizar) solamente dentro de una región de texto del programa llamado ámbito. Las diferentes entidades designadas por el mismo identificador tienen diferentes ámbitos o están en espacios de nombre diferente .Hay cuatro tipos de ámbitos: función, archivo, bloque y prototipo de función . (Un prototipo de la función es una declaración de una función que declara los tipos de sus parámetros.)

Las normas C90 y C11 tienen esencialmente la misma redacción.

{ llaves } en una declaración de estructura no definen un bloque, ni definen ninguno de los otros tipos posibles de ámbito, por lo que cualquier cosa declarada entre llaves no tiene alcance en esa región; debe tener un alcance en algún contexto circundante. Sucede que la sintaxis le permite declarar struct myinnerstruct dentro de otra definición de estructura, pero solo si es parte de una definición de miembro. Creo que esto solo está permitido porque los diseñadores del lenguaje no hicieron ningún esfuerzo adicional para rechazarlo; es solo un efecto secundario de otras reglas. Usted puede hacerlo, pero no lo recomiendo.

+0

Así que si quisiera tener una estructura [interna] que no se pudiera declarar por sí misma (pero solo declarando con una estructura externa), debería anidar las definiciones pero dejar la interna sin una etiqueta, como en su ejemplo ? – prelic

+0

@prelic: depende. ¿Por qué quieres una estructura interna en primer lugar? En el (presumiblemente) código simplificado que nos ha mostrado, solo hay una instancia de 'struct innerstruct', y es miembro de' struct mystruct'. ¿Por qué no aplanar la estructura para que los miembros de 'struct innerstruct' se conviertan en miembros directos de' struct mystruct'? No estoy necesariamente diciendo que esa es la solución correcta, pero saber por qué no lo está (si no es así) ayudaría a determinar cómo resolver su problema real. –

+0

Sí, me doy cuenta en este ejemplo, es trivial aplanar mi estructura. Pero donde realmente estoy aplicando esto, no es tan claro. Trabajo con estructuras (razonablemente) grandes, y estas estructuras forman estructuras más grandes. Es significativo si las estructuras de componentes son visibles o no fuera del conjunto de estructuras. – prelic

1

Una razón para elegir una u otra sería expectativas convencionales.

No se espera que una declaración de estructura anidada dentro de otra se reutilice en otro lugar, aunque pueda serlo.

Además, hay un choque psicológico al no poner cosas del mismo nivel de abstracción una al lado de la otra. Es perfectamente legal hacerlo, pero hace que entender el código sea un poco más difícil y tal vez más irritante.