Примечание: этот вопрос о name space
, а не namespace
.
Стандарт C ++ имеет некоторые ссылки name space
, но я не вижу определения этого. Стандарты гласят, что метки и макросы находятся в разных пространствах имен. Все остальные ссылки name space
находятся в разделе совместимости с C / C ++, например так ( текущий проект ):
Это одна из немногих несовместимостей между C и C ++, которую можно отнести к новому определению пространства имен C ++, где имя может быть объявлено как тип и как нетип в одной области видимости, что приводит к тому, что нетипичное имя скрывает имя типа и требование, чтобы ключевые слова class, struct, union или enum использовались для ссылки на имя типа. Это новое определение пространства имен обеспечивает важные нотационные удобства для программистов на C ++ и помогает максимально приблизить использование пользовательских типов к использованию фундаментальных типов.
Что это за новое определение пространства имен ? Где я могу найти это в стандарте? Каковы точные правила? Правила кажутся более сложными, чем «скрытые типы нетипизированных типов». Мол, это не компилируется:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
Но это делает:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
И это тоже не компилируется:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
источник
[stmt.label]/1
и одно для макросов[cpp]/8
.Ответы:
Пространство имен термин может быть более четко установлена в ISO C стандарт; цитируя ISO C11 :
Новое определение пространства имен из C ++, однако, ни в коей мере недавнего времени , и был описан в работе [diff.class] / 1 в его нынешнем виде когда - либо с момента введения C ++ Стандарта ISO в '98 . Это только когда-либо упомянуто в любой длине в контекстах, для которых это отличается от ISO C, согласно [diff.class] / 1, который цитируется OP.
На самом деле, нам нужно прибегнуть к ISO C11 / 6.2.3 и объединить его с [diff.class] / 1 стандарта ISO C ++ для целостного и полного описания (нового) определения пространства имен C ++ , за исключением того, что мы облажаем ISO Стандарт C ++ для, например, [basic.scope.hiding] , [class.name] / 2 , [stmt.label] / 1 , [cpp.replace] / 8 и т. Д., Чтобы увидеть, как и где он применяется.
источник
В C (6.2.3 пространства имен идентификаторов) понятие пространств имен определяется следующим образом.
Так, например, имя тега структуры может совпадать с именем функции, поскольку они принадлежат разным пространствам имен. Когда вы указываете структуру с именем тега структуры, когда вы должны использовать ключевое слово
struct
. Так, например, эти декларации не конфликтуют.В этом фрагменте кода имя тега
s
структуры не конфликтует с именем функции,s
потому что имя тега должно быть указано с ключевым словомstruct
.В C ++ вам разрешено использовать имена структурных тегов без ключевого слова
struct
.Например
правильный код В этой декларации
имя объявленного идентификатора
s
скрывает имя структуры. ТАК если потом напишешь напримертогда компилятор выдаст ошибку, потому что в этом операторе s рассматривается как имя идентификатора, объявленного выше. Чтобы устранить неоднозначность, вам нужно использовать ключевое слово struct
Это описано в следующей цитате из стандарта C ++ 20 (6.3.1 Декларативные области и области действия)
Как видно из цитаты, имя пространства имен должно быть уникальным в своем декларативном регионе. Итак, эти декларации
неверны.
источник