uso tipos programaciĆ³n enum definidos c++ c struct typedef

tipos - Typedef-name entra en conflicto con la etiqueta struct en C++



typedef struct uso (1)

En C ++, no puede usar struct myStruct para referirse a una estructura sin etiquetas que se ha typedef . Y no puede definir una struct myStruct diferente struct myStruct , porque el nombre colisiona con el nombre typedef.

Si agrega la etiqueta, tanto struct myStruct como myStruct se referirán al tipo, tanto en C como en C ++:

typedef struct myStruct { int one; int two; } myStruct;

Aquí no hay colisión en C ++ porque el nombre se resuelve en un solo tipo, y esto está específicamente permitido por una regla especial. La sección estándar de C ++ 7.1.3 incluye las siguientes reglas:

En un alcance no de clase dado, se puede usar un especificador typedef para redefinir el nombre de cualquier tipo declarado en ese alcance para referirse al tipo al que ya hace referencia.

Si se utiliza un especificador de tipo para redefinir en un ámbito determinado una entidad que se puede referenciar utilizando un especificador de tipo elaborado, la entidad puede seguir siendo referenciada por un especificador de tipo elaborado o como una enumeración o nombre de clase en una enumeración o de fi nición de clase respectivamente.

En un ámbito determinado, un especificador typedef no se utilizará para redefinir el nombre de ningún tipo declarado en ese ámbito para referirse a un tipo diferente.

De forma similar, en un ámbito determinado, una clase o enumeración no se declarará con el mismo nombre que un typedef-name que se declara en ese ámbito y se refiere a un tipo distinto de la clase o enumeración en sí.

[Nota: Un typedef-name que nombra un tipo de clase, o una versión cv-qualified del mismo, es también un nombre de clase (9.1). Si se utiliza un typedef-name para identificar el sujeto de un especificador de tipo elaborado (7.1.6.3), una definición de clase (cláusula 9), una declaración de constructor (12.1) o una declaración de destructor (12.4), el programa es mal formado . - nota final]

Esta es mi segunda investigación sobre la declaración de estructura en C ++. (El primero está aquí ) Pero ahora me encontré con esta publicación . Específicamente, no estoy seguro de por qué esto está perfectamente bien en C, pero no en C ++.

typedef struct{ int one; int two; }myStruct; struct myStruct; //forward declaration fails void blah(myStruct* pStruct);

El código anterior compila bien en mi cuadro de Ubuntu con GCC. Yo myStruct que es porque el primer myStruct vive en el espacio de nombres normal donde viven los nombres de las variables. El segundo myStruct vive en el espacio de nombres Tag . Cuando el compilador ve myStruct* en el prototipo de función, busca en ambos espacios de nombres y encuentra myStruct en el namspace normal y ese nombre pasa a ser un nombre typedef , por lo que puede ser un especificador de tipo válido. El segundo myStruct se puede definir más adelante como lo que quiera ser el programador. No habrá confusión / colisión con el primer myStruct sin nombre ya que el programador tiene que usar struct myStruct para referirse al segundo.

Pero en C ++, de acuerdo con la discusión que se encuentra en la pregunta vinculada , mi entendimiento es que el primer typedef myStruct vive en el espacio de nombres normal como de costumbre. El segundo myStruct también vive en el espacio de nombres normal (¿no hay espacio de nombres de etiquetas específico en C ++?), Pero puede ser eclipsado por otros identificadores. Entonces mi pregunta es por qué la primera myStruct que está en el mismo espacio de nombres como la segunda sombra myStruct la segunda myStruct ?

En un sentido más general, aparte de los espacios de nombres explícitos introducidos por el programador utilizando la facilidad de espacio de nombres proporcionada por el lenguaje C ++, ¿hay espacios de nombres predefinidos que eliminen el uso de identificadores (incluyendo etiquetas, etiquetas, nombres typedef, identificadores objeto / functino) como en C? (C tiene 4 espacios de nombre predefinidos encontrados en mi primera investigación). ¿Puedo encontrar estos en el estándar de C ++ indicando dónde pertenecen estos nombres?

EDITAR : Parece que no hice la pregunta lo suficientemente clara. Todo lo que quiero saber es

1) ¿Qué espacios de nombres (si están definidos en el idioma) son Lables, typedef names, tag names de struct / union / enum, función normal, variable normal / nombre del objeto pertenecen? (Si olvidé otro tipo de nombre, por favor agregue).

2) ¿Por qué el nombre normal de la función, nombre de la variable normal, los nombres de las etiquetas ocultas, mientras que los nombres de las etiquetas no pueden?

3) Si hay alguna cláusula en C ++ que especifique los espacios de nombre como en C ( Sección 6.2.1 )