Я работаю над кодом, написанным моим коллегой, который больше не работает с компанией, и нашел следующий код: (который я сократил ниже)
namespace NsA { namespace NsB { namespace NsC {
namespace {
class A { /*etc*/ };
class B { /*etc*/ };
}
namespace {
class C { /*etc*/ };
}
} } }
Я не понимаю назначения команд пространства имен в строках 3 и 8.
Может кто-нибудь объяснить, какова цель записи пространства имен без имени?
Спасибо





Это «анонимное пространство имен», которое создает скрытое имя пространства имен, которое гарантированно будет уникальным для каждой «единицы перевода» (то есть для каждого файла CPP).
Это фактически означает, что все элементы внутри этого пространства имен скрыты извне этой единицы компиляции. Их можно использовать только в том же файле. См. Также эта статья о безымянных пространствах имен.
Это также устраняет необходимость в переменных static (видимость модуля компиляции)
static все еще иногда бывает полезен. это приведет к тому, что имена не будут иметь внешней связи, в то время как анонимные пространства имен изменят привязку имен.
Хм, я думал, что неназванные пространства имен вызвали внутреннюю связь, но просто посмотрел, похоже, вы правы. Представьте, что ... :)
@GregRogers: Да, связь имеет значение, шаблоны могут быть созданы только с объектами внешней связи (например, попробуйте объявить класс внутри функции и использовать его внутри vector <>, не будет работать, класс в безымянном пространстве имен вне функции: будет работать .. .)
Спасибо за это последнее дополнение, Питер - то, о чем я никогда не думал. Хорошая информация!
Интересно. Я не знал, что ты сможешь это сделать. Придется иметь это в виду.