Nota: esta pregunta es sobre name space
, no namespace
.
El estándar C ++ tiene algunas referencias name space
, pero no veo la definición de esto. Los estándares dicen que las etiquetas y las macros están en diferentes espacios de nombres. Todas las demás referencias name space
están en la sección de compatibilidad C / C ++, como esta ( borrador actual ):
Esta es una de las pocas incompatibilidades entre C y C ++ que se puede atribuir a la nueva definición de espacio de nombres de C ++ en la que un nombre se puede declarar como un tipo y como un no tipo en un solo ámbito, lo que hace que el nombre sin tipo oculte el escriba el nombre y requiera que las palabras clave class, struct, union o enum se usen para referirse al nombre del tipo. Esta nueva definición de espacio de nombres proporciona importantes ventajas de notación a los programadores de C ++ y ayuda a que el uso de los tipos definidos por el usuario sea lo más similar posible al uso de los tipos fundamentales.
¿Cuál es esta nueva definición de espacio de nombres ? ¿Dónde puedo encontrarlo en el estándar? ¿Cuáles son las reglas exactas? Las reglas parecen ser más complicadas que los "tipos no ocultos". Como, esto no compila:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
Pero esto hace:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
Y esto tampoco compila:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
fuente
[stmt.label]/1
y otro para macros[cpp]/8
.Respuestas:
El término de espacio de nombres puede estar más bien establecido en la Norma ISO C; citando ISO C11 :
La nueva definición de espacio de nombres de C ++ es, sin embargo, de ninguna manera reciente en el tiempo , y se ha descrito en [diff.class] / 1 en su forma actual desde la introducción de C ++ estándar ISO en el '98 . Solo se menciona en cualquier extensión en los contextos en los que difiere de ISO C, según [diff.class] / 1, que es citado por el OP.
Afaics necesitamos recurrir a ISO C11 / 6.2.3 y combinarlo con [diff.class] / 1 del estándar ISO C ++ para obtener una descripción coherente y completa de la (nueva) definición de espacio de nombres de C ++ , menos que azotemos el ISO Estándar de C ++ para, por ejemplo, [basic.scope.hiding] , [class.name] / 2 , [stmt.label] / 1 , [cpp.replace] / 8 y así sucesivamente para ver cómo y dónde se aplica.
fuente
En C (6.2.3 Espacios de nombre de identificadores) la noción de espacios de nombre se define de la siguiente manera.
Entonces, por ejemplo, un nombre de etiqueta de estructura puede coincidir con un nombre de función porque pertenecen a diferentes espacios de nombre. Cuando especifica una estructura con un nombre de etiqueta de estructura cuando tiene que usar la palabra clave
struct
. Entonces, por ejemplo, estas declaraciones no entran en conflicto.En este fragmento de código, el nombre
s
de la etiqueta de la estructura no entra en conflicto con el nombre de la funcións
porque el nombre de la etiqueta se especificará con la palabra clavestruct
.En C ++ puede usar nombres de etiquetas de estructura sin la palabra clave
struct
.Por ejemplo
Es un código correcto. En esta declaración
El nombre del identificador declarado
s
oculta el nombre de la estructura. Entonces si entonces escribirás por ejemploentonces el compilador emitirá un error porque en esta declaración s se considera como el nombre del identificador declarado anteriormente. Para resolver la ambigüedad, debe usar la palabra clave struct
Esto se describe en la siguiente cita del Estándar C ++ 20 (6.3.1 Regiones declarativas y ámbitos)
Como puede ver en la cita, un nombre de espacio de nombres debe ser único en su región declarativa. Entonces estas declaraciones
son incorrectos
fuente