2011-11-27 27 views
22

¿Hay alguna importancia detrás de permitir la visibilidad de estructuras anidadas fuera de la estructura en C pero no en C++? No encontré ninguna referencia o relevancia.Estructuras anidadas en C y C++

struct a 
{ 
    struct b{ 
    }; 
}; 

int main(){ 
    struct b var; // allowed in C not in C++. 
} 
+2

En C++ usaría 'a :: b var;' –

+0

De alguna manera, nunca me di cuenta de que había una diferencia ... – Mehrdad

+2

e operator :: presentado solo en C++ junto con la noción de diferentes ámbitos? – Kos

Respuesta

4

porque b está dentro de un alcance, usted tiene que utilizar struct a::b lugar (y al contrario que en C, la palabra clave struct es opcional).

32

Es válido en C porque C tiene un único espacio de nombre en el que se definen todos los tipos no locales (es decir, tipos no declarados en funciones); no hay un alcance de tipos usando espacios de nombres o anidamiento.

En C++, el tipo b está anidado como un miembro de la clase a, por lo que su nombre se debe calificar con el ámbito en el que se declara.

+0

@JimBalter Gracias; fijo. –

+0

¿No tiene C dos espacios de nombres globales separados para los nombres de tipo escalar y para las estructuras o algo así? –

+1

@KerrekSB: Sí, en cierto sentido. El espacio de nombres en cuestión aquí es el espacio de nombres de las etiquetas (en 'struct a {};', la etiqueta es 'a'). –

8

Creo que la capacidad de referenciar estructuras anidadas fuera de la estructura se eliminó en C++ para mejorar el ocultamiento de datos. Si necesita acceder a una estructura anidada externamente, probablemente no debería ser una estructura anidada en primer lugar.

Wikipedia dice: "En C y C++ se pueden definir tipos de estructuras anidadas, pero el alcance se interpreta de manera diferente (en C++, una estructura anidada se define únicamente dentro del alcance/espacio de nombres de la estructura externa)." (http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B). No dice por qué, pero al menos reconoce la diferencia.

Sin embargo, puede usar el operador de resolución del espacio de nombres para acceder a la estructura.

+2

El * por qué * parece estar evitando la contaminación del espacio de nombres. De http://www2.research.att.com/~bs/sibling_rivalry.pdf: "En C, los ámbitos de estructura que parecen estar anidados no lo son, porque los nombres de estructura declarados en el interior se consideran en el ámbito externo. resultó ser inmanejable en C++ donde las clases anidadas a menudo eran utilizadas como detalles de implementación. En consecuencia, C++ adoptó ámbitos de estructura anidados. " – UncleBens

+0

Sí, eso tiene sentido, gracias. –

+0

+1 para "probablemente no debería ser una estructura anidada en primer lugar". – mskfisher

2

No se puede declarar nada sin un ámbito en C++ En su ejemplo struct B está situado dentro de la estructura de una, compilador no sabe dónde encontrar struct b

usted tiene que utilizar

struct a :: b var; 

En C no hay ninguna restricción para el alcance, pero C++ garantiza una restricción