Remarque: cette question concerne name space
, non namespace
.
La norme C ++ a quelques références name space
, mais je ne vois pas la définition de cela. Les normes indiquent que les étiquettes et les macros se trouvent dans des espaces de noms différents. Toutes les autres références à se name space
trouvent dans la section de compatibilité C / C ++, comme ceci (version actuelle ):
Il s'agit de l'une des rares incompatibilités entre C et C ++ qui peuvent être attribuées à la nouvelle définition d'espace de nom C ++ où un nom peut être déclaré en tant que type et en tant que non-type dans une seule étendue, ce qui fait que le nom non-type masque le nom de type et nécessitant que la classe de mots clés, la structure, l'union ou l'énumération soient utilisés pour faire référence au nom de type. Cette nouvelle définition d'espace de nom offre des fonctionnalités de notation importantes aux programmeurs C ++ et aide à rendre l'utilisation des types définis par l'utilisateur aussi similaire que possible à l'utilisation des types fondamentaux.
Quelle est cette nouvelle définition d'espace de nom ? Où puis-je le trouver dans la norme? Quelles sont les règles exactes? Les règles semblent être plus compliquées que les «types de masques non-types». Comme, cela ne compile pas:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
Mais cela:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
Et cela ne compile pas non plus:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
la source
[stmt.label]/1
et un pour les macros[cpp]/8
.Réponses:
Le terme d' espace de nom peut être plus bien établi dans la norme ISO C; citant ISO C11 :
La nouvelle définition de l' espace de noms de C ++ n'est cependant en aucun cas récente et a été décrite dans [diff.class] / 1 dans sa forme actuelle depuis l'introduction de la norme ISO C ++ en '98 . Elle n'est mentionnée dans aucune longueur dans les contextes pour lesquels elle diffère de l'ISO C, selon [classe diff.] / 1 citée par l'OP.
Afaics, nous devons recourir à l'ISO C11 / 6.2.3 et la combiner avec [classe diff.] / 1 de la norme ISO C ++ pour une description cohérente et complète de la (nouvelle) définition d'espace de nom de C ++ , moins nous fouettons l'ISO Norme C ++ pour par exemple [basic.scope.hiding] , [class.name] / 2 , [stmt.label] / 1 , [cpp.replace] / 8 et ainsi de suite pour voir comment et où cela s'applique.
la source
En C (6.2.3 Espaces de noms des identifiants), la notion d'espaces de noms est définie de la manière suivante.
Ainsi, par exemple, un nom de balise de structure peut coïncider avec un nom de fonction car ils appartiennent à des espaces de noms différents. Lorsque vous spécifiez une structure avec un nom de balise de structure lorsque vous devez utiliser le mot clé
struct
. Ainsi, par exemple, ces déclarations ne sont pas en conflit.Dans cet extrait de code, le nom
s
de balise de la structure n'entre pas en conflit avec le nom de la fonctions
car le nom de balise doit être spécifié avec le mot cléstruct
.En C ++, vous êtes autorisé à utiliser des noms de balises de structure sans le mot clé
struct
.Par exemple
est un code correct. Dans cette déclaration
le nom de l'identifiant déclaré
s
cache le nom de la structure. Alors si tu écriras par exemplealors le compilateur émettra une erreur car dans cette instruction s est considéré comme le nom de l'identifiant déclaré ci-dessus. Pour résoudre l'ambiguïté, vous devez utiliser le mot clé struct
Ceci est décrit dans la citation suivante de la norme C ++ 20 (6.3.1 Régions déclaratives et étendues)
Comme vous pouvez le voir dans la citation, un nom d'espace de noms doit être unique dans sa région déclarative. Donc, ces déclarations
sont incorrects.
la source